簡體   English   中英

使用OAuth 2.0從Azure B2C AD訪問用戶數據

[英]Accessing user data from Azure B2C AD with OAuth 2.0

我們希望通過Azure B2C AD使用OAuth 2.0對我們的Web應用程序的用戶進行身份驗證。 管理B2C AD的用戶將來自不同的來源,有些是我們自己創建的,但大多數會自己注冊,並且我們希望啟用其他身份提供商(例如Github或Google),因此使用Azure B2C AD代替Azure Active Directory。 我們還希望將這些用戶(包括一些自注冊用戶)分組。

基本的身份驗證工作流程(包括注冊過程)起作用:我們在B2C租戶中創建了一個應用程序,啟用了Web API訪問,生成了一個客戶端機密以及一個用於登錄以及注冊和設置我們的第三方身份提供者的用戶流。

我們在https://<tenant>.b2clogin.com/tfp/<tenant>.onmicrosoft.com/<user-flow>/oauth2/v2.0/authorize?client_id=<client-id>&redirect_uri=<redirect-uri>&scope=<client-id>&response_type=code上啟動用戶身份驗證https://<tenant>.b2clogin.com/tfp/<tenant>.onmicrosoft.com/<user-flow>/oauth2/v2.0/authorize?client_id=<client-id>&redirect_uri=<redirect-uri>&scope=<client-id>&response_type=code

用戶返回有效的授權碼,我們使用該授權碼從https://<tenant>.b2clogin.com/tfp/<tenant>.onmicrosoft.com/<user-flow>/oauth2/v2.0/token請求訪問令牌https://<tenant>.b2clogin.com/tfp/<tenant>.onmicrosoft.com/<user-flow>/oauth2/v2.0/token使用以下POST數據:

{
    "code":"<authorization-code>",
    "client_id":"<client-id>",
    "client_secret":"<client-secret>",
    "redirect_uri":"<redirect-uri>",
    "grant_type":"authorization_code"
}

然后,我們想使用此訪問令牌從Azure AD Graph API( https://graph.windows.net/ /me?api-version=1.6)提取用戶的配置文件數據(包括用戶名,電子郵件和組成員身份)。 文檔明確指出B2C目錄不得使用新的Microsoft Graph API https://docs.microsoft.com/zh-CN/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet

API響應令牌已過期:

<?xml version="1.0" encoding="utf-8"?><error
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><code>Authentication_ExpiredToken</code><message
xml:lang="en">Your access token has expired. Please renew it before
submitting the request.</message></error>

但是https://jwt.ms/解碼的令牌中的時間戳則表示:

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
  "iss": "https://<tenant>.b2clogin.com/<id>/v2.0/",
  "exp": 1553689573,
  "nbf": 1553685973,
  "aud": "<client-id>",
  "idp": "github.com",
  "name": "<username>",
  "oid": "<oid>",
  "sub": "<sub>",
  "emails": [
    "<email>"
  ],
  "tfp": "B2C_1_SignupAndSignin",
  "azp": "<client-id>",
  "ver": "1.0",
  "iat": 1553685973
}.[Signature]

但是,令牌中的aud僅是我們的應用程序,不是Azure AD Graph API。 這表明Azure B2C AD發出的令牌對於Graph API完全無效。

所以我們的問題是,什么是正確的方法:

  • 獲取B2C AD用戶的訪問令牌,這將使我們能夠獲取用戶信息
  • 讀取經過身份驗證的B2C AD用戶的配置文件和組成員身份

使用Azure AD / B2C用戶Secure API的一些答案建議創建另一個應用程序以查詢Graph API。 那是實現我們目標的唯一途徑嗎?

我認為您將無法使用B2C令牌訪問Azure AD Graph API。

您可以使用B2C令牌訪問某些受B2C保護的資源,例如Azure功能或您的應用程序。

在這種情況下,我認為您將需要使用服務帳戶代表用戶連接到Azure AD Graph API。 在服務器端,您的應用程序將需要實施基於角色的必要訪問控制-例如,僅獲取當前用戶信息。 您可以在應用程序中使用B2C令牌( 已通過驗證 )來發現當前用戶。

Azure AD B2C:使用Azure AD Graph API

對於B2C租戶,有兩種與Graph API通信的主要模式。

  • 對於一次運行的交互式任務,在執行任務時,您應充當B2C租戶的管理員帳戶。 此模式要求管理員使用憑據登錄,然后該管理員才能執行對Graph API的任何調用。
  • 對於自動化的連續任務,應該使用提供了必要特權的某種類型的服務帳戶來執行管理任務。 在Azure AD中,您可以通過注冊應用程序並向Azure AD進行身份驗證來實現。 這是通過使用使用OAuth 2.0客戶端憑據授予的應用程序ID來完成的。 在這種情況下,應用程序將以自身而非用戶的身份調用Graph API。

暫無
暫無

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

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