簡體   English   中英

訪問令牌和用戶ID

[英]Access token and user ID

我目前正在嘗試使用ADFS 2016對angular 7應用進行身份驗證(使用angular-oauth2-oidc)。 到目前為止,它運行良好。 當我訪問該應用程序時,我將重定向到ADFS登錄頁面,在其中輸入我的憑據並獲取令牌。

現在,當應用程序調用Web API時,它將在請求標頭中發送訪問令牌。 ADFS返回的訪問令牌如下所示:

{
  "aud": "microsoft:identityserver:xxx",
  "iss": "http://xxx/adfs/services/trust",
  "iat": 1554561406,
  "nbf": 1554561406,
  "exp": 1554565006,
  "apptype": "Public",
  "appid": "xxx",
  "authmethod": "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport",
  "auth_time": "2019-04-06T12:21:39.222Z",
  "ver": "1.0",
  "scp": "profile openid"
}

問題在於,Web API必須知道進行調用的用戶的ID(因為在應用程序級別定義了一些權限)。 我在這里看到可以將聲明添加到訪問令牌中。 但是,在閱讀Internet上的文章時,我讀到顯然不是應該使用訪問令牌來標識用戶,因此我不知道添加由Web API用來標識用戶的聲明是否正確。

但是,我在這里讀到

訪問令牌擁有的唯一用戶信息是位於子聲明中的用戶ID。

但是默認情況下,ADFS不提供“子”令牌。 如果我自己添加包含用戶電子郵件地址的“子”聲明是正確的,還是我必須以其他方式處理?

是的,不應使用訪問令牌來識別用戶。 但是,如果您可以將用戶標識符添加到訪問令牌中,而這正是您需要了解的有關用戶的全部信息,那么這可能是最簡單的方法。 但這是針對您的身份驗證服務器的特定於實現的。

標准方法是詢問profile范圍(您已完成此操作)並從userinfo端點獲取信息(請參閱OpenID Connect RFC )。 如果使用這種方式,則可能要緩存響應,因此不需要在每個客戶端請求上都進行此HTTP調用。

如果您的后端API僅由Angular應用程序使用,並且不應被第三方調用,則您也可以考慮將后端用作OAuth2客戶端,該客戶端接收授權代碼並將其交換為ID令牌。 然后,它可以將用戶的身份(從ID令牌中讀取)保存在會話中,並發出標識該會話的cookie。 因此,前端無需在每個請求上發送令牌。 這將使后端成為有狀態的,但可能更易於實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM