主頁 > .NET開發 > 從零搭建一個IdentityServer——初識OpenIDConnect

從零搭建一個IdentityServer——初識OpenIDConnect

2021-02-02 06:04:29 .NET開發

上一篇文章實作了IdentityServer4與Asp.net core Identity的集成,可以使用通過identity注冊功能添加的用戶,以Password的方式獲取Access token,但是無論是Client Credentials還是Password流程它都是OAuth2.0的流程,本篇文章就來先介紹一下關于OpenIDConnect的基本概念和用法, 本文有以下內容:
  • OpenIDConnect介紹及基本概念
  • OIDC授權碼流程及實作
  • OIDC隱式流程及實作
  • 小結

OpenIDConnect介紹及基本概念

  根據OpenIDConnect的定義簡單來說,OpenIDConnect=(Identity, Authentication)+Oauth2.0(來自:https://openid.net/connect/faq/) 另外從下面的回答可以看出OAuth2.0是一個身份驗證/授權框架,而OpenID Connect基于這些提供了身份標識功能,身份標識就是“是誰”的 問題,

   至于oidc如何實作的,詳情可以查看檔案:https://openid.net/specs/openid-connect-core-1_0.html,從檔案中可以找到這樣幾個關鍵詞:ID Token、Authentication、Authentication Request、Authorization Code Flow、Implicit Flow、Hybrid Flow、Response_Type、Authorization Endpoint、Token Endpoint,

  以及兩個表,OIDC身份驗證流程表:      OIDC身份驗證請求對應的相應型別(Response_Type)表:      還有一個流程圖:       從以上關鍵詞可以獲得下面的資訊:
  • ID Token:是一個包含特定宣告(Claim)的jwt,特定的宣告指的是身份驗證服務器驗證終端用戶時候產生的供客戶端使用的資訊,如發行人(issuer)、最終用戶標識(sub)、客戶端id(aud)、過期時間(exp)、Token的發布時間(iat)、用戶身份驗證時間(auth_time)等,另外也可以包含其它的宣告,ID Token由身份驗證服務器(IdentityServer4,OP)頒發,交由客戶端(RP)進行驗證,
  • Authentication:由IdentityServer4(OP)提供的身份驗證(登錄),最終用戶通過IdentityServer4(OP)的身份驗證(登錄)后,就可以發起Authentication Request,或者說如果在發起Authentication Request時用戶未進行身份驗證時將重定向到身份驗證界面進行身份驗證,
  • Authentication Request:向IdentityServer4(OP)的授權終結點發起的,用于獲取ID Token、授權碼(Authorization Code)甚至是訪問Token(Access Token)的請求,
  • Authorization Code Flow、Implicit Flow、Hybrid Flow:Authentication Request的三種不同請求流程,
  • Response_Type:Authentication Request的引數之一,根據設定該引數來決定使用哪一種請求流程,
  • Authorization Endpoint:授權終結點,用于接收Authentication Request,
  • Token Endpoint:令牌終結點,用于接收訪問令牌(Access Token)獲取請求,
      從兩個表格可以知道:三種身份驗證流程的特性,如各Token從哪個終結點回傳、是否向用戶代理(如瀏覽器)透漏Token、是否支持重繪Token等,三種身份驗證流程通過指定Response_Type來決定,如引數值為code時進行授權碼流程Id_token以及id_token token時進行隱式流程,包含code以及token時為混合流程,       流程圖可以了解到OpenIDConnect的整個身份驗證及授權步驟,而最終具體的實作就直接對應到授權碼流程、隱式流程和混合流程,

OIDC授權碼流程及實作

  下面以授權碼流程為例進行詳細解說,首先授權碼流程步驟如下:      授權碼流程一共有八個步驟,簡單來說就是由客戶端向身份驗證服務器發起身份驗證請求(回應型別為code),身份驗證服務器向用戶進行身份驗證及用戶允許和授權操作后,將授權碼發送給客戶端,客戶端通過授權碼向身份驗證服務器的Token中階段獲取ID和Access Token,然后對ID Token進行驗證并獲取用戶的ID資訊,     接下來使用之前創建的IdentityServer來實作基于授權碼流程的身份驗證與授權,   上一篇文章已經對IdentityServer添加了用戶及Asp.net Core Identity組件的支持,目前無需再進行任何修改,換句話說現在的IdentityServer已經能夠頒發ID Token了,完成授權碼流程僅需要Client的支持,Client我們使用之前文章中添加的Web API來演示,把原有的基于Jwt Bearer的身份驗證代碼注釋掉,添加基于cookie以及OIDC的身份驗證服務(注:添加OIDC的時候Client資訊需要與IdentityServer中資料庫一致,并且相應的Client配置的重定向地址需要與該應用程式匹配):   

   確保“interactive”這個客戶端的重定向地址為“應用程式地址/signin-oidc”,這里需要注意的是這個重定向地址實際上是客戶端(WebApi)通過方法.AddOpenIdConnect添加的用于處理odic身份驗證的身份驗證處理器:

  

  然后啟動專案,并訪問受保護的資源:https://localhost:51001/WeatherForecast   就會跳轉到身份驗證服務器的登錄頁面:

   下面是登錄頁面url資訊:

  可以看到三個引數:   1、第一個引數是因為客戶端向Identity服務器發起身份驗證請求(Authentication Request),但由于終端用戶還未登錄,所以先跳轉登錄頁面,當完成登陸后將回傳/connect/authorize/callback,   2、第三個引數是回應型別,值為code,代表當前使用授權碼流程,   3、第二個引數重定向uri是完成授權后,將攜帶授權碼重定向的地址,也就是web Api程式的oidc身份驗證地址,   對于授權碼流程的八個步驟來說,它完成了前三個,目前處于終端用戶身份驗證(未完成-還未輸入用戶名密碼)階段:      輸入用戶名密碼登錄后,就可以看到受保護的內容了:      這里完成授權碼流程的后四個步驟:       這四個步驟都是由客戶端的oidc身份驗證處理器完成的(具體實作參見:https://github.com/dotnet/aspnetcore/blob/main/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectHandler.cs)   整個程序主要是應用程式(Client)和身份驗證服務器進行互動并完成,相關的授權碼、ID token以及Access Token均“未”發送到瀏覽器中,所以授權碼流程也是最為安全的流程,   如何在客戶端獲得相應的Access Token呢?通過HttpContext.GetTokenAsync("token name");即可獲得相應的Token:   ID Token:

  Access Token:

  可以通過HttpContext獲取Token的原因是在添加oidc身份驗證服務時,將SaveTokens選項設定為true,當身份驗證成功后程式會自動將各類Token存盤到AuthenticationProperties中,最終加密寫入Cookie里面,所以雖然資料保存在瀏覽器,但由于加密緣故,所以之前才說他們均“未”發送到瀏覽器中:   那么授權碼流程最后一步要如何實作呢?這里有兩種方法,其一是通過獲取access token之后直接在程式中訪問身份驗證服務器的UserInfo Endpoint獲取,另外就是將oidc選項的GetClaimsFromUserInfoEndpoint設定為true即可:      未獲取UserInfo的User Claims資訊:      獲取UserInfo后的User Claims資訊,可以看到多了一個name的claim(關于為什么只有一個claim后續文章中再進行說明):   

OIDC隱式流程及實作

  既然最復雜的授權碼流程已經能夠實作了,那么簡單的隱式流程肯定沒問題,下面就演示一下如何通過隱式流程將token直接獲取到瀏覽器中,   首先創建一個支持隱式流程的client:      注:資料庫中創建client復制已有的資料修改即可,client密碼是加密存盤的,復制后使用被復制的client密碼即可,另外因為需要將token資訊發送到瀏覽器,所以需要將client資訊中的“AllowAccessTokenViaBrowser”設定為1,   將client的資訊配置到client應用上:      隱式流程要求回應型別為id_token或id_token及token,   配置完成后運行程式并攜帶以下引數,直接訪問IdentityServer的授權終結點:   https://localhost:5001/connect/authorize?response_type=id_token token&scope=openid scope2&client_id=test1&state=22222&redirect_uri=https://localhost:51001/swagger/index.html&nonce=11111   登錄成功后程式將自動跳轉到引數redirect_uri指定的路徑,并且攜帶token及相關資訊:   將整個url格式化后獲得以下結果:

小結

  本篇文章介紹了OpenIDConnect的基本概念,并通過已有的IdentitySever程式演示了基于授權碼和隱式流程,其中授權碼模式是一種較為安全的模式,所有的關鍵的資料包括授權碼以及各類token均在client的后臺完成,如果需要可以把相關的token加密后以cookie的方式放到客戶端以供后續使用,而隱式模式可以將各類token回傳到瀏覽器中,這種模式可以在單頁應用中使用,將token交由js來進行管理并用于受保護資源的訪問,   另外到目前為止我們可以看到的是IdentityServer或者說IdentityServer4的作用就是校驗Client資訊、終端用戶的用戶名密碼資訊,然后生成授權碼以及各類token,而token的驗證和使用實際上還是在Client中進行的,   最后OIDC是一個身份驗證協議,那么身份驗證和授權在Asp.net core應用程式中是如何體現的呢?下篇文章就來聊聊這個問題,     參考:   https://openid.net/specs/openid-connect-core-1_0.html   https://openid.net/connect/faq/   https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-protocols-oidc   本文鏈接:https://www.cnblogs.com/selimsong/p/14355150.html 從零搭建一個IdentityServer——目錄

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/255415.html

標籤:.NET Core

上一篇:在 ASP.NET Core 應用中使用 Cookie 進行身份認證

下一篇:《Effective C#》筆記(3) - 泛型

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more