天天看點

IdentityServer4系列 | 常見術語說明

 ​

一、前言

在​​上一篇​​中,我們IdentityServer4的說明,認識到是一個基于OpenID Connect協定标準的身份認證和授權程式,并簡單的對基礎知識的認識以及差別說明,從OAuth、OpenID、OpenID Connect以及JWT等進行對比差別說明。

而在這一篇中,我們主要對IdentityServer4中涉及使用的特定的相關術語進行說明。

IdentityServer4系列 | 常見術語說明

二、術語

2.1 身份認證伺服器(IdentityServer)

IdentityServer 是基于OpenID Connect協定标準的身份認證和授權程式,它實作了OpenID Connect 和 OAuth 2.0 協定。

同樣的角色,不同的文檔使用不同的術語。在有些文檔中,它(IdentityServer)可能會被叫做安全令牌伺服器(security token service)、身份提供者(identity provider)、授權伺服器(authorization server)、 辨別提供方((IP-STS,什麼是​​IP-STS​​)等等。

但是它們都是一樣的,都是向用戶端發送安全令牌(security token),

IdentityServer有許多功能:

  • 保護你的資源
  • 使用本地帳戶或通過外部身份提供程式對使用者進行身份驗證
  • 提供會話管理和單點登入
  • 管理和驗證客戶機
  • 向客戶發出辨別和通路令牌
  • 驗證令牌

2.2 使用者(User)

使用者是使用已注冊的用戶端通路資源的人。

指在id4中已經注冊的使用者

2.3 用戶端(Client)

用戶端就是從identityserver請求令牌的軟體,既可以通過身份認證令牌來驗證識别使用者身份,又可以通過授權令牌來通路服務端的資源。但是用戶端首先必須在申請令牌前已經在identityserver服務中注冊過。

實際用戶端不僅可以是Web應用程式,app或桌面應用程式,SPA,伺服器程序等。

用戶端:web、app、桌面應用、SPA、伺服器程序

2.4 資源(Resources)

資源就是你想用identityserver保護的東西,可以是使用者的身份資料或者api資源。

每一個資源都有一個唯一的名稱,用戶端使用這個唯一的名稱來确定想通路哪一個資源

在通路之前,實際identityserver服務端已經配置好了哪個用戶端可以通路哪個資源,是以你不必了解為用戶端隻要指定名稱他們就可以随便通路任何一個資源

使用者的身份資訊實際由一組claim組成,例如姓名或者郵件都會包含在身份資訊中。

使用者身份資訊将來通過identityserver校驗後都會傳回給被調用的用戶端

API資源就是用戶端想要調用的功能——通常通過 Web API 來對 API 資源模組化,但這不是必須的,如下說明:

通常以json或xml的格式傳回給用戶端,例如webapi,wcf,webservice,可以使其他類型的格式,這個要看具體的使用場景了。

2.5 身份令牌(Id Token)

OIDC對OAuth2最主要的擴充就是提供了ID Token。來解決第三方用戶端辨別使用者身份認證的問題。

OIDC的核心在于在OAuth2的授權流程中,一并提供使用者的身份認證資訊(ID Token)給到第三方用戶端,ID Token使用JWT格式來包裝,得益于JWT(JSON Web Token)的自包含性,緊湊性以及防篡改機制,使得ID Token可以安全的傳遞給第三方用戶端程式并且容易被驗證。此外還提供了UserInfo的接口,使用者擷取使用者的更完整的資訊。

ID Token是一個安全令牌,表示的是認證過程的輸出,是一個授權伺服器提供的包含使用者資訊,還包含了使用者的認證時間和認證方式。身份令牌可以包含額外的身份資料。

由一組Cliams構成以及其他輔助的Cliams的JWT格式的資料結構組成。

ID Token的主要構成部分如下(使用OAuth2流程的OIDC)。

  1. iss = Issuer Identifier:必須。提供認證資訊者的唯一辨別。一般是一個https的url(不包含querystring和fragment部分)。
  2. sub = Subject Identifier:必須。iss提供的EU的辨別,在iss範圍内唯一。它會被RP用來辨別唯一的使用者。最長為255個ASCII個字元。
  3. aud = Audience(s):必須。辨別ID Token的閱聽人。必須包含OAuth2的client_id。
  4. exp = Expiration time:必須。過期時間,超過此時間的ID Token會廢棄不再被驗證通過。
  5. iat = Issued At Time:必須。JWT的建構的時間。
  6. auth_time = AuthenticationTime:EU完成認證的時間。如果RP發送AuthN請求的時候攜帶max_age的參數,則此Claim是必須的。
  7. nonce:RP發送請求的時候提供的随機字元串,用來減緩重播攻擊,也可以來關聯ID Token和RP本身的Session資訊。
  8. acr = Authentication Context Class Reference:可選。表示一個認證上下文引用值,可以用來辨別認證上下文類。
  9. amr = Authentication Methods References:可選。表示一組認證方法。
  10. azp = Authorized party:可選。結合aud使用。隻有在被認證的一方和閱聽人(aud)不一緻時才使用此值,一般情況下很少使用。

ID Token通常情況下還會包含其他的Claims。

(畢竟上述claim中隻有sub是和EU相關的,這在一般情況下是不夠的,必須還需要EU的使用者名,頭像等其他的資料,OIDC提供了一組公共的cliams,請移步這裡http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims)。另外ID Token必須使用JWS進行簽名和JWE加密,進而提供認證的完整性、不可否認性以及可選的保密性。

簡而言之ID Token就是JWT格式的資料,包含一個人類使用者的身份認證的資訊,一個ID Token的例子如下:

IdentityServer4系列 | 常見術語說明

2.6 通路令牌(Access Token)

通路令牌允許用戶端通路某個 API 資源。用戶端請求到通路令牌,然後使用這個令牌來通路 API資源。通路令牌包含了用戶端和使用者(如果有的話,這取決于業務是否需要,但通常不必要)的相關資訊,API通過這些令牌資訊來授予用戶端的資料通路權限。

OAuth2提供了Access Token來解決授權第三方用戶端通路受保護資源的問題;
IdentityServer4系列 | 常見術語說明

2.7 重新整理令牌(Refresh Token)

Access Token 是用戶端通路資源伺服器的令牌。擁有這個令牌代表着得到使用者的授權。然而,這個授權應該是臨時的,有一定有效期。這是因為,Access Token 在使用的過程中可能會洩露。給 Access Token 限定一個較短的有效期可以降低因 Access Token 洩露而帶來的風險。

然而引入了有效期之後,用戶端使用起來就不那麼友善了。每當 Access Token 過期,用戶端就必須重新向使用者索要授權。這樣使用者可能每隔幾天,甚至每天都需要進行授權操作。這是一件非常影響使用者體驗的事情。希望有一種方法,可以避免這種情況。

于是 Oauth2.0 引入了 Refresh Token 機制。Refresh Token 的作用是用來重新整理 Access Token。鑒權伺服器提供一個重新整理接口,例如:

​​http://xxx.xxx.com/refresh?refreshtoken=&client_id=&client_secret=​​

三、總結

  1. 本篇主要是對IdentityServer4的說明,以及其中涉及常見的術語的表述說明。
  2. 從身份認證伺服器、使用者、用戶端、資源以及各個令牌等進行對比差別說明。
  3. 在後續中會對多種授權模式,資料庫持久化以及UI界面優化和常見問題,搭建一個完整可用的認證授權項目。
  4. 如果有不對的或不了解的地方,希望大家可以多多指正,提出問題,一起讨論,不斷學習,共同進步。

四、參考

繼續閱讀