Tips:本篇已加入,.Net core 3.1 使用IdentityServer4 實現 OAuth2.0 --閱讀目錄 可點擊查看更多相關文章。
前言
本來這篇隨筆,開始寫之前我大概羅列了一下,准備還是先帶大家了解一下IdentityServer的一些概念,順便解釋一下之后實戰篇會提及的一些名詞,我重新翻了一遍官方文檔后正好說到 startup,我覺得 .net core Startup中,
Authentication 和 Authorization 有必要說一下,這兩個看似差不多的單詞,確實一開始我自己也傻傻分不清楚到底是干嘛的,那么現在言歸正傳,開始今天的隨筆。
IdentityServer4介紹
學習一個技術最好的文檔就是官方文檔 https://identityserver4.readthedocs.io/en/3.1.0/ 如果英語閱讀能力有限,可以網絡上搜一下有沒有大牛的中文翻譯+案例演示,最終大家還是要嘗試閱讀官方文檔,有能力的甚至可以看一下源碼(這一點我自己也在努力中)。
那么從這篇文章開始說到做到,我們看一下 英文的介紹:
IdentityServer4 is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core. It enables the following features in your applications:
Authentication as a Service
Centralized login logic and workflow for all of your applications (web, native, mobile, services). IdentityServer is an officially certified implementation of OpenID Connect.
Single Sign-on / Sign-out
Single sign-on (and out) over multiple application types.
Access Control for APIs
Issue access tokens for APIs for various types of clients, e.g. server to server, web applications, SPAs and native/mobile apps.
Federation Gateway
Support for external identity providers like Azure Active Directory, Google, Facebook etc. This shields your applications from the details of how to connect to these external providers.
Focus on Customization
The most important part - many aspects of IdentityServer can be customized to fit
your needs. Since IdentityServer is a framework and not a boxed product or a SaaS, you can write code to adapt the system the way it makes sense for your scenarios.
Mature Open Source
IdentityServer uses the permissive Apache 2 license that allows building commercial products on top of it. It is also part of the .NET Foundation which provides governance and legal backing.
Free and Commercial Support
If you need help building or running your identity platform, let us know. There are several ways we can help you out.
|
意思就是告訴大家 IdentityServer4 是一個 同時實現了OpenID Connect and OAuth 2.0(什么是OAuth2.0 這里我開一個傳送門 可以看之前的博客) 的.netcore 框架 ,
注意看7個加粗的標題:作為服務進行身份驗證 , 單點登錄注銷SSO , API資源的訪問控制 ,對外部平台的支持 ,專注於定制 , 成熟的開源,免費和商業支持
意思就是ID4 已經很成熟的一個身份認證框架,支持Azure,谷歌,facebook等平台,可以在框架里定制一些功能,並且開源免費也可以在源代碼層面進行修改,
這樣我們可以省去很多時間去構造一個符合標准流程的授權服務,並且我們相信一個成熟的開源項目在代碼執行效率上也是大家公認的。
文檔目錄如下
INTRODUCTION 介紹 (理論概念)
QUICKSTARTS 快速開始(大部分文檔都是有一個快速的可運行的demo案例)
TOPICS 話題 (比較着重的可以分類出來的點)
ENDPOINTS (這個我不知道怎么翻譯,就和我們常說的到這個服務端endpoint,startup中配置路由的endpoint差不多的概念)
REFERENCE 參考(一些名詞的解釋,就像我們看書的時候 下面的注釋)
MISC 其他
我分享一下我的學習方式:
1.基礎概念肯定先看,我們至少要知道這個能做什么.
2.然后一開始可能接觸原版文檔對我來說會比較難,我也會網絡上看一些國內的翻譯一些demo,這個時候我已經大致能知道怎么用了
3.哪塊東西不明白我才會針對性的在官網里搜索關鍵詞,或者是哪一塊我覺得demo里可能還有一些屬性沒說清楚我再看看文檔
4.結合項目實戰 :那當然有時候我會做一些技術儲備,更多的是我碰到了什么問題需要在項目中用到,畢竟實踐出真知
(強調:不是真實開發中都要用到最新的技術,適合場景的才是最好的,不要盲目一味的堆用新技術)
5.最最后,我會整理一下 x-mind ,在公司內做一些技術分享,這會很有用,因為你要授課,你就必須至少自己理清楚(也感謝騰訊直播,讓我在公司內部做了一把直播)
名詞解釋
之后的實戰中我可能會提及一些名詞,這里我先解釋一下,或者告訴一下大家 哪些東西我縮寫,簡稱成什么:
ID4 :之后IdentityServer4 我都會簡稱成 ID4 。
用戶:真實的操作手機,微信,或者網站的人。
客戶端:訪問資源的程序,可能是web的,客戶端的,或者時一個控制台程序(也可能時一個api 他要訪問另一個資源api那么這個api以后的文章中我也會稱為客戶端)。
資源:那些受到保護的api接口就屬於資源,比如用戶要查詢的數據,用戶要做的數據操作,用戶要看的圖片。
認證授權服務器:ID4程序的所在服務器,辦法令牌也是通過他,是否能夠授權也是他,物理上可以和資源服務器是一個。
資源服務器:通常就是我們的網站后台,api后台,或者是文件服務器。
令牌:之后文章中涉及到的通過認證服務辦法的包括JWT等的這些字符串。
授權頭:http請求 Headers里面 key為Authorization 對應的value 之后都會直接寫成授權頭。
Schame/方案名: 授權頭一般格式都是 Bearer xxxxxxxx 這個Bearer之后文章會直接用 Schame稱呼。
Policy/規則: 規則名稱 我們控制器上會加一個[Authorize] 這個標簽可以支持一個參數policy ,類似 [Authorize("AuthJWT")] 這樣可以針對 AuthJWT這個policy做單獨的處理。
那么后面文章我會說 方案名是BenBearer的授權頭, 意思就是 Authorization的value, Schame是BenBearer這個字符串。
Authentication 和 Authorization
先介紹一下我怎么記這兩個東西的,記住一個單詞:認證授權,字母順序先c后z,然后拆開看 認證是c(Authentication)授權是z(Authorization),就像背口訣一樣,再講一下他倆做了什么:
你去公司上班前台給你發了門卡,然后你拿了門卡去刷卡開門,發門禁卡這步操作肯定是比你去刷門禁卡先做的。
發門禁卡就是認證(前台已經識別了你的身份了你是這個公司的員工,才會發給你),刷卡開門就是授權(你會發現自己辦公室的門可以刷開,老板辦公室的刷不開,因為老板辦公室這個資源你不能擁有)
我這里po一下之前asp.net的 認證和授權的代碼:
我找了之前.net framework代碼 認證都是自己實現的,好尷尬,那就不貼代碼了,授權我貼一下代碼:
有沒有看到 重寫的是 OnAuthorization 這個方法。
官網上我找了一下asp.net mvc的 HttpApplication 事件執行順序:
按照以下順序引發應用程序事件:
|
如果按照正規流程也是 認證在 授權之前處理。
重點關注 !畢竟我們系列講的是netcore 下面看下netcore中,授權認證是怎么處理的
netcore的啟動的一個核心文件 startup (再開一個傳送門,之后會針對netcore核心做一個系列,先預留坑位)中進行認證授權的注入以及使用
ConfigureServices 方法中(這個方法里面做的事情主要是將服務注入到容器中)進行認證的注入
......
......
//注入授權Handler
services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
services.AddSingleton(permissionRequirement);
services.AddAuthorization(options => { options.AddPolicy(policyName, policy => policy.Requirements.Add(permissionRequirement));
}) .AddAuthentication(options => { options.DefaultScheme = defaultScheme; }) .AddJwtBearer(defaultScheme, o => { //不使用https o.RequireHttpsMetadata = isHttps; o.TokenValidationParameters = tokenValidationParameters; });
大致意思就是做了認證授權處理的一些邏輯 授權頭自己定了方案名,授權有自己的規則,也有自己的一些環境變量,controller里 [Authorize("AuthJWT")] 這樣的標簽我就能解析出來
並且 PermissionHandler 這個類就是重寫了如何去授權。具體實戰再細說。
最后 Configure 方法中去使用認證和授權的中間件,否則剛才的注入都白搭
app.UseHttpsRedirection(); app.UseAuthentication(); app.UseRouting(); app.Use(next => context => { context.Request.EnableBuffering(); return next(context); }); //add by benjamin 使用跨域 app.UseCors("AllowAll"); app.UseAuthorization();
注意!! 在.net 2.1中是沒有UseAuthorization方法的, 在3.0之后微軟明確的把授權功能提取到了Authorization中間件里,所以我們需要在UseAuthentication之后再次UseAuthorization。 否則,當你使用授權功能比如使用[Authorize]屬性的時候系統就會報錯。 |
是不是簡單易懂,今天你學廢了嗎?
如果覺得本篇隨筆對你有幫助,請點擊右下方的 【推薦👍】,或者給作者 【打賞】,感謝大家的支持,這將成為作者繼續寫作的動力。 |