IdentityServer4 介紹以及一些名詞解釋

Tips:本篇已加入,.Net core 3.1 使用IdentityServer4 實現 OAuth2.0 --閱讀目錄  可點擊查看更多相關文章。html

前言

原本這篇隨筆,開始寫以前我大概羅列了一下,準備仍是先帶你們瞭解一下IdentityServer的一些概念,順便解釋一下以後實戰篇會說起的一些名詞,我從新翻了一遍官方文檔後正好說到 startup,我以爲 .net core Startup中,ios

Authentication 和 Authorization 有必要說一下,這兩個看似差很少的單詞,確實一開始我本身也傻傻分不清楚究竟是幹嗎的,那麼如今言歸正傳,開始今天的隨筆。程序員

 


 

 

IdentityServer4介紹

學習一個技術最好的文檔就是官方文檔 https://identityserver4.readthedocs.io/en/3.1.0/  若是英語閱讀能力有限,能夠網絡上搜一下有沒有大牛的中文翻譯+案例演示,最終你們仍是要嘗試閱讀官方文檔,有能力的甚至能夠看一下源碼(這一點我本身也在努力中)。web

那麼從這篇文章開始說到作到,咱們看一下 英文的介紹: api

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等平臺,能夠在框架裏定製一些功能,而且開源免費也能夠在源代碼層面進行修改,mvc

這樣咱們能夠省去不少時間去構造一個符合標準流程的受權服務,而且咱們相信一個成熟的開源項目在代碼執行效率上也是你們公認的。

 

文檔目錄以下

 

 

 

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 事件執行順序:

按照如下順序引起應用程序事件:

  1. BeginRequest

  2. AuthenticateRequest

  3. PostAuthenticateRequest

  4. AuthorizeRequest

  5. PostAuthorizeRequest

  6. ResolveRequestCache

  7. PostResolveRequestCache

    事件以後 PostResolveRequestCache 和 PostMapRequestHandler 事件以前,事件處理程序 (這是與建立的請求 URL) 對應的頁面。 若是服務器在集成模式下運行 IIS 7.0,而且至少 .NET Framework 版本3.0,則 MapRequestHandler 會引起事件。 若是服務器在經典模式下運行 IIS 7.0 或 IIS 的早期版本,則沒法處理此事件。

  8. PostMapRequestHandler

  9. AcquireRequestState

  10. PostAcquireRequestState

  11. PreRequestHandlerExecute

    執行事件處理程序。

  12. PostRequestHandlerExecute

  13. ReleaseRequestState

  14. PostReleaseRequestState

    PostReleaseRequestState引起事件後,任何現有響應篩選器都將篩選輸出。

  15. UpdateRequestCache

  16. PostUpdateRequestCache

  17. LogRequest.

    此事件在 IIS 7.0 集成模式下受支持,而且至少 .NET Framework 3。0

  18. PostLogRequest

    此事件支持 IIS 7.0 集成模式,而且至少支持 .NET Framework 3。0

  19. EndRequest

 

 若是按照正規流程也是 認證在 受權以前處理。

 重點關注 !畢竟咱們系列講的是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]屬性的時候系統就會報錯。

 

 

 

 

 

是否是簡單易懂,今天你學廢了嗎?

 若是以爲本篇隨筆對你有幫助,請點擊右下方的 【推薦👍】,或者給做者 【打賞】,感謝你們的支持,這將成爲做者繼續寫做的動力。
相關文章
相關標籤/搜索