1. 程式人生 > >[認證授權] 5.OIDC(OpenId Connect)身份認證授權(擴充套件部分)

[認證授權] 5.OIDC(OpenId Connect)身份認證授權(擴充套件部分)

在上一篇[認證授權] 4.OIDC(OpenId Connect)身份認證授權(核心部分)中解釋了OIDC的核心部分的功能,即OIDC如何提供id token來用於認證。由於OIDC是一個協議族,如果只是簡單的只關注其核心部分其實是不足以搭建一個完整的OIDC服務的。本篇則解釋下OIDC中比較常用的幾個相關擴充套件協議,可以說是搭建OIDC服務必備的幾個擴充套件協議(在上一篇中有提到這幾個協議規範):

  1. Discovery:可選。發現服務,使客戶端可以動態的獲取OIDC服務相關的元資料描述資訊(比如支援那些規範,介面地址是什麼等等)。
  2. OAuth 2.0 Form Post Response Mode
    :可選。針對OAuth2的擴充套件,OAuth2回傳資訊給客戶端是通過URL的querystring和fragment這兩種方式,這個擴充套件標準提供了一基於form表單的形式把資料post給客戶端的機制。
  3. 會話管理:Session Management :可選。Session管理,用於規範OIDC服務如何管理Session資訊;

1 OIDC Discovery 規範

顧名思義,Discovery定義了一個服務發現的規範,它定義了一個api( /.well-known/openid-configuration ),這個api返回一個json資料結構,其中包含了一些OIDC中提供的服務以及其支援情況的描述資訊,這樣可以使得oidc服務的RP可以不再硬編碼OIDC服務介面資訊。這個api返回的示例資訊

如下(這裡面只是一部分,更完整的資訊在官方的規範中有詳細的描述和解釋說明:http://openid.net/specs/openid-connect-discovery-1_0.html):

相信大家都看得懂的,它包含有授權的url,獲取token的url,登出token的url,以及其對OIDC的擴充套件功能支援的情況等等資訊,這裡就不再詳細解釋每一項了。

2 OAuth2 擴充套件:Multiple Response Types

  1. code:oauth2定義的。用於獲取authorization_code。
  2. token:oauth2定義的。使用者獲取access_token。
  3. id_token:OIDC定義的。使用者獲取id_token。

至此OIDC是支援三種類型的response_type的,不但如此,OIDC還允許了可以組合這三種類型,即在一個response_type中包含多個值(空格分隔)。比如當引數是這樣的時候 response_type=id_token token ,OIDC服務就會把access_token和id_token一併給到呼叫方。OIDC對這些型別的支援情況體現在上面提到的Discovery服務中返回的response_types_supported欄位中:

3 OAuth2 擴充套件:Form Post Response Mode

在oauth2的授權碼流程中,當response_type設定為code的時候,oauth2的授權服務會把authorization_code通過url的query部分傳遞給呼叫方,比如這樣“https://client.lnh.dev/oauth2-callback?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz”。

在oauth2的隱式授權流程中,當response_type設定為token的時候,oauth2的授權服務會直接把access_token通過url的fragment部分傳遞給呼叫方,比如這樣“http://client.lnh.dev/oauth2-callback#access_token=2YotnFZFEjr1zCsicMWpAA&state=xyz&expires_in=3600”;

在oauth2中,上面的兩種情況是其預設行為,並沒有通過引數來顯示的控制。OIDC在保持oauth2的預設行為的基礎上,增加了一個名為response_mode的引數,並且增加了一種通過form表單傳遞資訊的方式,即form_post(詳細資訊定義在http://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html)。OIDC服務對這個擴充套件的支援情況體現在上面提到的Discovery服務中返回的response_modes_supported欄位中:

當reponse_mode設定為form_post的時候,OIDC則會返回如下的資訊:

  <html>
   <head><title>Submit This Form</title></head>
   <body onload="javascript:document.forms[0].submit()">
    <form method="post" action="https://client.lnh.dev/oidc-callback">
      <input type="hidden" name="state"
       value="DcP7csa3hMlvybERqcieLHrRzKBra"/>
      <input type="hidden" name="id_token"
       value="eyJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ.eyJzdWIiOiJqb2huIiw
         iYXVkIjoiZmZzMiIsImp0aSI6ImhwQUI3RDBNbEo0c2YzVFR2cllxUkIiLC
         Jpc3MiOiJodHRwczpcL1wvbG9jYWxob3N0OjkwMzEiLCJpYXQiOjEzNjM5M
         DMxMTMsImV4cCI6MTM2MzkwMzcxMywibm9uY2UiOiIyVDFBZ2FlUlRHVE1B
         SnllRE1OOUlKYmdpVUciLCJhY3IiOiJ1cm46b2FzaXM6bmFtZXM6dGM6U0F
         NTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZCIsImF1dGhfdGltZSI6MTM2Mz
         kwMDg5NH0.c9emvFayy-YJnO0kxUNQqeAoYu7sjlyulRSNrru1ySZs2qwqq
         wwq-Qk7LFd3iGYeUWrfjZkmyXeKKs_OtZ2tI2QQqJpcfrpAuiNuEHII-_fk
         IufbGNT_rfHUcY3tGGKxcvZO9uvgKgX9Vs1v04UaCOUfxRjSVlumE6fWGcq
         XVEKhtPadj1elk3r4zkoNt9vjUQt9NGdm1OvaZ2ONprCErBbXf1eJb4NW_h
         nrQ5IKXuNsQ1g9ccT5DMtZSwgDFwsHMDWMPFGax5Lw6ogjwJ4AQDrhzNCFc
         0uVAwBBb772-86HpAkGWAKOK-wTC6ErRTcESRdNRe0iKb47XRXaoz5acA"/>
    </form>
   </body>
  </html>

這是一個會在html載入完畢後,通過一個自動提交的form表單,把id_token,access_token,authorization_code或者其他的相關資料POST到呼叫方指定的回撥地址上。

4 OIDC 會話管理

綜合上篇提到的idtoken和前面的discovery服務以及針對oauth2的擴充套件,則可以讓OIDC服務的RP完成使用者認證的過程。那麼如何主動的撤銷這個認證呢(也就是我們常說的退出登入)?總結來說就是其認證的會話管理,OIDC單獨定義了3個獨立的規範來完成這件事情:

其中Session Management是OIDC服務自身管理會話的機制;Back-Channel Logout則是定義在純後端服務之間的一種登出機制,應用場景不多,這裡也不詳細解釋了。這裡重點關注一下Front-Channel Logout這個規範(http://openid.net/specs/openid-connect-frontchannel-1_0.html),它的使用最為廣泛,其工作的具體的流程如下(結合Session Management規範)

在上圖中的2和3屬於session management這個規範的一部。其中第2步中,odic的退出登入的地址是通過Discovery服務中返回的end_session_endpoint欄位提供的RP的。其中還有一個check_session_iframe欄位則是供純前端的js應用來檢查oidc的登入狀態用的。

4567這四步則是屬於front-channel logout規範的一部分,OIDC服務的支援情況在Discovery服務中也有對應的欄位描述:

4567這一部分中重點有兩個資訊:

  1. RP退出登入的URL地址(這個在RP註冊的時候會提供給OIDC服務);
  2. URL中的sessionid這個引數,這個引數一般是會包含在idtoken中給到OIDC客戶端,或者在認證完成的時候以一個獨立的sessionid的引數給到OIDC客戶端,通常來講都是會直接把它包含在IDToken中以防止被篡改。

5 總結

本篇部落格介紹了OIDC的發現服務,OAuth2的兩個擴充套件規範,以及OIDC管理會話的機制。至此則可以構成一個完整的認證和退出的流程。其中有一點需要特別注意,這個流程中用到的token是OIDC定義的IDTokenIDToken

6 Example

筆者基於IdentityServer3和IdentitySever4(兩者都是基於OIDC的一個.NET版本的開源實現)寫的一個整合SSO,API訪問授權控制,QQ聯合登陸(作為OP)的demo:https://github.com/linianhui/oidc.example 。

參考

相關推薦

[認證授權] 5.OIDCOpenId Connect身份認證授權擴充套件部分

在上一篇[認證授權] 4.OIDC(OpenId Connect)身份認證授權(核心部分)中解釋了OIDC的核心部分的功能,即OIDC如何提供id token來用於認證。由於OIDC是一個協議族,如果只是簡單的只關注其核心部分其實是不足以搭建一個完整的OIDC服務的。本篇則解釋下OIDC中比較常用的幾個相關擴

[認證授權] 4.OIDCOpenId Connect身份認證授權核心部分

1 什麼是OIDC? OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0 protocol. It allows Clients to verify the identity of the End-User ba

ASP.NET Core的身份認證框架IdentityServer49-使用OpenID Connect新增使用者認證

原文: ASP.NET Core的身份認證框架IdentityServer4(9)-使用OpenID Connect新增使用者認證 OpenID Connect OpenID Connect 1.0是OAuth 2.0協議之上的一個簡單的身份層。 它允許客戶端基於授權伺服器執行的身份驗證來驗證終端使用者的

基於OIDCOpenID Connect的SSO

在[認證授權]系列部落格中,分別對OAuth2和OIDC在理論概念方面進行了解釋說明,其間雖然我有寫過一個完整的示例(https://github.com/linianhui/oidc.example),但是卻沒有在實踐方面做出過解釋。在這裡新開一個系列部落格,來解釋其各種不同的應用場景。因為OIDC是在

ASP.NET Core 認證授權[3]:OAuth & OpenID Connect認證

原文: ASP.NET Core 認證與授權[3]:OAuth & OpenID Connect認證 在上一章中,我們瞭解到,Cookie認證是一種本地認證方式,通常認證與授權都在同一個服務中,也可以使用Cookie共享的方式分開部署,但侷限性較大,而如今隨著微服務的流行,更加偏向於將以前的單體應用

413day版心三個模組中的左中部分

《2018年11月21日》【連續413天】 標題:版心三個模組中的左中部分; 內容: <!-- 左部分 --> <div class="jd-clo1"> <ul> <li><a href="#"

mybatis使用foreach批次插入,解決sequence只查詢一次的問題在此,我只看union all 部分

oracle的批量插入方式是: insert  into db(id, zgbh, shbzh)         select '1', '2', '3' from dual         union all select '2', '3', '4' from dual

OpenID Connect Core 1.0使用授權碼流驗證

3.1 使用授權碼流驗證(Authentication using the Authorization Code Flow) 本節描述如何使用授權碼流執行驗證。當使用授權碼流時,會從令牌終結點返回的所有令牌。 授權碼流返回授權碼給客戶端,這個授權碼可以直接交換一個ID T

CentOS6.5下搭建ftp服務器三種認證模式:匿名用戶、本地用戶、虛擬用戶

所有者 start 生效 用戶權限 密碼 新建 over 使用 則無 CentOS 6.5下搭建ftp服務器 vsftpd(very secure ftp daemon,非常安全的FTP守護進程)是一款運行在Linux操作系統上的FTP服務程序,不僅完全開源而且免費,此外,

項目一:第十二天 1、常見權限控制方式 2、基於shiro提供url攔截方式驗證權限 3、在realm中授權 5、總結驗證權限方式四種 6、用戶註銷7、基於treegrid實現菜單展示

eal 重復數 規則 認證通過 delete get 數據庫 filter 登陸 1 課程計劃 1、 常見權限控制方式 2、 基於shiro提供url攔截方式驗證權限 3、 在realm中授權 4、 基於shiro提供註解方式驗證權限 5、 總結驗證權限方式(四種) 6、

OpenID Connect Core 1.0介紹

pairwise color 類型 客戶端 itu-t endpoint nta 框架 方式 IdentityServer4是基於OpenID Connect and OAuth 2.0框架,OpenID Connect Core 1.0是IdentityServer4最重

OpenID Connect Core 1.0ID Token

不同的 可能 indent ext mon 來源 conn 請求 引用 2、ID Token(ID Token) OpenID Connect主要是對OAuth 2.0 能夠使得終端用戶通過ID Token的數據結構進行驗證。當客戶端和潛在的其他請求聲明,ID Token包

OpenID Connect Core 1.0從第三方發起登入

在某些情況下,登入流程由一個OpenID提供者或其他方發起,而不是依賴方(RP)。在這種情況下,發起者重定向到RP在發起登入終結點,RP的請求驗證請求傳送到指定的OP。這個發起登入終結點可以在RP深度連結,而不是預設的登入頁面。RPs支援OpenID Connect Dynamic Client Regist

OpenID Connect Core 1.0聲明(Claims)

sil 額外 求一個 回聲 排序。 rfc6750 默認的配置 obj 什麽 5 聲明(Claims) 這一節說明客戶端如何獲取關於終端用戶聲明和驗證事件。它還定義了一組標準的基本聲明配置。預定義一組可請求的聲明,使用特定的scope值或能用於請求參數中的個人聲明。聲明可以

OpenID Connect Core 1.0使用隱式驗證流

3.2 使用隱式驗證流(Authentication using the Implicit Flow) 本節描述如何使用隱式流程執行驗證。使用隱式流程時,所有令牌從授權終結點返回;不使用令牌終結點返回。 隱式流程主要是由客戶在瀏覽器中使用指令碼語言實現。直接返回Access Token和ID Token到

阿里雲大資料ACP認證知識點梳理5——基礎SQL語句DML部分

insert overwrite table sale_detail_insert partition (sale_date='2013', region='china')insert into table sale_detail_insert partition (sale_date='2013', reg

OpenID Connect Core 1.0宣告(Claims)

5 宣告(Claims) 這一節說明客戶端如何獲取關於終端使用者宣告和驗證事件。它還定義了一組標準的基本宣告配置。預定義一組可請求的宣告,使用特定的scope值或能用於請求引數中的個人宣告。宣告可以直接來自OpenID提供者或分散式來源。 5.1 標準宣告(Stand

restframework5認證元件

認證功能簡介 Django 自帶一個使用者認證系統,這個系統處理使用者帳戶、組、許可權和基於 cookie 的會話。本文將一步步的解讀restframework中的認證類。 認證功能說明 使用者登陸後才能訪問某些頁面。 如果使用者沒有登入就訪問該頁面的

Angular SPA基於Ocelot API閘道器與IdentityServer4的身份認證授權

在上一講中,我們已經完成了一個完整的案例,在這個案例中,我們可以通過Angular單頁面應用(SPA)進行登入,然後通過後端的Ocelot API閘道器整合IdentityServer4完成身份認證。在本講中,我們會討論在當前這種架構的應用程式中,如何完成使用者授權。 回顧 《Angular SPA基於Oc

Asp.net MVC使用FormsAuthentication,MVC和WEB API可以共享身份認證 轉載

mlp ges web api nbsp 快速 charset 生成頁面 核心 lds 在實際的項目應用中,很多時候都需要保證數據的安全和可靠,如何來保證數據的安全呢?做法有很多,最常見的就是進行身份驗證。驗證通過,根據驗證過的身份給與對應訪問權限。同在Web Api中如何