.NET Core微服务之基于IdentityServer建立授权与验证服务
一、IdentityServer的預(yù)備知識
要學(xué)習(xí)IdentityServer,事先得了解一下基于Token的驗證體系,這是一個龐大的主題,涉及到Token,OAuth&OpenID,JWT,協(xié)議規(guī)范等等等等,園子里已經(jīng)有很多介紹的文章了,個人覺得solenovex的這一篇文章《學(xué)習(xí)IdentityServer4的預(yù)備知識》言簡意賅,可以快速的看看。另外savaboard的《ASP.NET Core 之 Identity 入門(一)》和《ASP.NET Core 之 Identity 入門(二)》這兩篇也可以一看,對Claims和Identity的基本知識講的比較通俗易懂,深入淺出,有故事情節(jié),哈哈。
重點關(guān)注一下上面這張圖(也是來自solenovex的文章),對于一個User(已注冊)來說,他會首先向Authorization Server表明自己的身份(比如輸入用戶名和密碼),然后Authorization Server為其發(fā)放了一個token,而這個token就好比是把家里的鑰匙配了一把(clone)新的,此后該User就可以訪問API請求獲取Orders(訂單)數(shù)據(jù)了。當然,實際中可能Authorization Server和API Server不在同一個區(qū)域內(nèi),它們可能只能遙望對方。此外,User還可以基于這個token去訪問第三方服務(wù),第三方服務(wù)會使用這個API來訪問API Server,向其提供token比提供username&password要安全得多。
二、IdentityServer極簡介紹
IdentityServer4(這里只使用版本號為4)是一個基于OpenID Connect和OAuth 2.0的針對ASP.NET Core 2.0的框架。IdentityServer是將規(guī)范兼容的OpenID Connect和OAuth 2.0終結(jié)點添加到任意ASP.NET Core應(yīng)用程序的中間件。通常,你構(gòu)建(或重新使用)包含登錄和注銷頁面的應(yīng)用程序,IdentityServer中間件會向其添加必要的協(xié)議頭,以便客戶端應(yīng)用程序可以使用這些標準協(xié)議與其對話。
我們可以用IdentityServer來做啥?
(1)身份驗證服務(wù)=>官方認證的OpenID Connect實現(xiàn)
(2)單點登錄/注銷(SSO)
(3)訪問受控的API=>為不同的客戶提供訪問API的令牌,比如:MVC網(wǎng)站、SPA、Mobile App等
(4)等等等......
三、Started:第一個AuthorizationServer
1.1 建立一個ASP.NET Core空Web項目
建立ASP.NET Core項目,使用Empty空模板。
為了更好地查看日志信息,同時考慮到IISExpress啟動起來真的很慢,修改lanuchSettings.json文件如下:
1.2 安裝并配置IdentityServer4
Step1.首先安裝IdentityServer4:
NuGet>Install-Package IdentityServer4
Step2.配置ASP.NET Core管道,即修改Configure方法
Step3.為了要把IdentityServer注冊到容器中,需要對其進行配置,而這個配置中要包含三個信息:
(1)哪些API可以使用這個AuthorizationServer
(2)哪些Client可以使用這個AuthorizationServer
(3)哪些User可以被這個AuthrizationServer識別并授權(quán)
這里為了快速演示,我們寫一個基于內(nèi)存的靜態(tài)類來快速填充上面這些信息(實際中,可以持久化在數(shù)據(jù)庫中通過EF等ORM獲取,也可以通過Redis獲取):
? Step4.對于Token簽名需要一對公鑰和私鑰,不過IdentityServer為開發(fā)者提供了一個AddDeveloperSigningCredential()方法,它會幫我們搞定這個事,并默認存到硬盤中。當切換到生產(chǎn)環(huán)境時,還是得使用正兒八經(jīng)的證書,更換為使用AddSigningCredential()方法。
?
1.3 獲取你心心念念的Token
Step1.啟動剛剛我們建立的AuthorizationServer程序,這里我們綁定的是5000端口。
Step2.啟動Postman/SoapUI等API測試工具,通過向HTTP Body中填寫數(shù)據(jù)發(fā)起POST請求:
Step3.發(fā)送一個錯誤的數(shù)據(jù),看看返回的是啥?(這里輸入了一個不在定義列表中的client_id)
Step4.查看控制臺的日志信息:表示獲取Token的這個請求成功了,日志中client_secret和password都是不會直接明文顯示的。
Step5.IdentityServer中我們設(shè)置這幾個API Service的Grant_Type是ResourceOwnerPasswordAndClientCredentials(點擊這里了解=>資源擁有者密碼憑據(jù)許可),因此我們還可以使用ClientCredentials(點擊這里了解=>客戶端憑據(jù)許可),如下所示:
Step6.再次查看控制臺日志信息:這次沒有關(guān)于User相關(guān)的任何信息顯示了。
Step7.基本的開發(fā)結(jié)束,對于開發(fā)階段,我們使用IdentityServer為開發(fā)者提供的臨時證書即可,但是后面仍然需要生成一些正兒八經(jīng)的證書。這里我們通過OpenSSL來生成,首先去官網(wǎng)下載一個,這里使用的是Win64_1.1版本。打開Powershell或者CMD,輸入以下命令:
cmd>openssl req -newkey rsa:2048 -nodes -keyout cas.clientservice.key -x509 -days 365 -out cas.clientservice.cer
下面將生成的證書和Key封裝成一個文件,以便IdentityServer可以使用它們?nèi)フ_地簽名tokens
cmd>openssl pkcs12 -export -in?cas.clientservice.cer -inkey?cas.clientservice.key -out?cas.clientservice.pfx
中途會提示讓你輸入Export Password,這個password后面會用到,記住它。最終導(dǎo)出后的結(jié)果如下圖所示:
這里我將其放到了項目結(jié)構(gòu)文件夾中,并設(shè)置這個pfx文件為“如果較新則復(fù)制”,確保可以在最后生成的目錄里邊。現(xiàn)在就可以修改一下ConfigureServices()方法了:
這里我將證書的路徑和導(dǎo)出密碼都寫到了配置文件中:
{ ?"Certificates": { ?
? ??"CerPath": "certificate\\cas.clientservice.pfx",
?? ?"Password": "manulife"} }
好,配置正兒八經(jīng)的證書這一步驟Over。
四、IdentityServer QuickStart-UI
4.1 關(guān)于QuickStart UI
IdentityServer為我們提供了一套UI以便使我們能夠快速地開發(fā)具有基本功能的認證/授權(quán)界面,我們可以去這個地址:https://github.com/IdentityServer/IdentityServer4.Quickstart.UI/tree/release?下載,并將其復(fù)制到我們的項目目錄中。
復(fù)制完成后,我們的項目結(jié)構(gòu)如下圖所示:
4.2 修改DI方法
(1)使用MVC與靜態(tài)文件(由于wwwroot下有很多靜態(tài)資源文件)
(2)注冊MVC
4.3 Run
(1)首頁(這里由于我已經(jīng)登錄,所以這里會把我的賬號顯示了出來)
(2)Logout頁,剛剛說到我已經(jīng)實現(xiàn)Login了,所以我這里L(fēng)ogout一下
(3)Login頁:這里只能識別我們在之前配置的靜態(tài)User列表中那些User
登錄之后,顯示:"You have not given access to any applications",表示我們還沒有給他授予訪問任何API或網(wǎng)站模塊的權(quán)限。后續(xù)我們會創(chuàng)建API和MVC網(wǎng)站來演示如何對其進行授權(quán)和訪問。
五、小結(jié)
本篇主要簡單的介紹了IdentityServer以及如何基于IdentityServer建立一個基本的AuthorizationServer,如何獲取Token,以及集成QuickStart UI實現(xiàn)基本的界面展示。后續(xù)還會創(chuàng)建API和MVC網(wǎng)站,來和IdentityServer進行集成,以演示如何對User授予訪問API和MVC網(wǎng)站的訪問權(quán)限。
示例代碼
Click =>?https://github.com/EdisonChou/EDC.IdentityServer4.Demo
參考資料
《identityserver4官方文檔》=> 重點關(guān)注那些流程圖與術(shù)語
ddrsql,《IdentityServer4之Resource Owner Password Credentials(資源擁有者密碼憑據(jù)許可)》
ddrsql,《IdentityServer4之Client Credentials(客戶端憑據(jù)許可)》
solenovex,《學(xué)習(xí)Identity Server4的預(yù)備知識》
solenovex,《使用Identity Server 4建立Authorization Server (1)》
solenovex,《使用Identity Server 4建立Authorization Server (2)》
solenovex,《使用Identity Server 4建立Authorization Server (3)》
使用Identity Server 4建立Authorization Server (4)
使用Identity Server 4建立Authorization Server (5)
Identity Service - 解析微軟微服務(wù)架構(gòu)eShopOnContainers(二)
IdentityServer4(OAuth2.0服務(wù))折騰筆記
IdentityServer4 指定角色授權(quán)(Authorize(Roles="admin"))
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架學(xué)習(xí)保護API
IdentityServer4 SigningCredential(RSA 證書加密)
IdentityServer4 實現(xiàn)自定義 GrantType 授權(quán)模式
IdentityServer4 配置負載均衡
IdentityServer4使用教程1--搭建ID4網(wǎng)站
IdentityServer4(10)- 添加對外部認證的支持之QQ登錄
IdentityServer4 第三方快速入門和示例
原文地址:https://www.cnblogs.com/edisonchou/p/identityserver4_foundation_and_quickstart_01.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的.NET Core微服务之基于IdentityServer建立授权与验证服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好代码是管出来的——使用GitHub
- 下一篇: .NET Core微服务之基于Ident