簡體   English   中英

Azure AD B2C Graph API 401 未經授權

[英]Azure AD B2C Graph API 401 Unauthorized

我正在嘗試執行 Azure AD Graph API REST API 調用以獲取當前登錄的用戶信息。 但是,對https://graph.windows.net/me?api-version=1.6的 HTTP GET 調用總是失敗,響應為401 Unauthorized 我已經在 Azure AD 中注冊了一個應用程序並配置了以下 API 權限:

在此處輸入圖片說明

對授權端點的調用如下所示:

HTTP GET https://{我的租戶}.b2clogin.com/{我的租戶}.onmicrosoft.com/oauth2/v2.0/authorize?p=B2C_1_signinsignup&client_id={my app id}&nonce=defaultNonce&redirect_uri= https://localhost :44351/Login/LoginResponse&scope=https://graph.windows.net/Directory.AccessAsUser.All https://graph.windows.net/User.Read&response_type=code&prompt=login

對令牌端點的調用如下所示:

HTTP POST 到 URL:https://{我的租戶}.b2clogin.com/{我的租戶}.onmicrosoft.com/B2C_1_signinsignup/oauth2/v2.0/token 內容類型:application/x-www-form-urlencoded

身體:

grant_type=authorization_code&client_id={my app id}&scope= https://graph.windows.net/Directory.AccessAsUser.All https://graph.windows.net/User.Read&code= {從授權端點收到的代碼}&redirect_uri= https://localhost:44351/Login/LoginResponse&client_secret= {來自門戶的秘密}

到令牌端點的 HTTP POST 成功。 我獲得了 JWT 令牌,並且能夠成功地從 JWT 檢索訪問令牌。 但是,當我嘗試使用此訪問令牌檢索用戶詳細信息時,以下代碼每次都失敗並返回 401 響應。 錯誤信息是

"odata.error":{"code":"Authentication_ExpiredToken","message":{"lang":"en","value":"您的訪問令牌已過期。請在提交請求前更新它。"}} }"

string strURL = @"https://graph.windows.net/me?api-version=1.6";
                HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(strURL);
                httpWebRequest.Headers.Add("Authorization", $"Bearer {jWTToken.access_token}");                
                using (HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
                {
                    using (StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream()))
                    {
                        string str = streamReader.ReadToEnd();
                    }
                }

上面代碼中使用的 JWT 令牌是我從 Token 端點收到的令牌。 為什么會失敗? 我收到的訪問令牌由 jwt.ms 解碼如下:

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
  "iss": "https://{my tenant}.b2clogin.com/fc292353-4def-47bd-af44-b92e40798a60/v2.0/",
  "exp": 1576642155,
  "nbf": 1576638555,
  "aud": "00000002-0000-0000-c000-000000000000",
  "oid": "05c93456-2f02-4601-afb0-d4599b7e6826",
  "sub": "05c93456-2f02-4601-afb0-d4599b7e6826",
  "tfp": "B2C_1_signinsignup",
  "nonce": "defaultNonce",
  "scp": "Directory.AccessAsUser.All User.Read",
  "azp": "{my app ID}",
  "ver": "1.0",
  "iat": 1576638555
}.[Signature]

B2C 不支持對 Graph API 的委托訪問。 您必須向應用程序注冊添加應用程序權限,並使用客戶端憑據身份驗證來獲取令牌。

請參閱文檔: https : //docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet? tabs = applications#assign-api-access- permissions

在應用程序權限下,選擇讀取和寫入目錄數據。

從基礎 Azure AD 的令牌終結點而不是 B2C 策略終結點獲取令牌。

您當然無法使用/me ,因為令牌不包含用戶信息。 但是您可以使用/users/id代替。

401 的原因可能是您的令牌中的發行者。 Graph API 期望正常的 AAD 頒發者,但事實並非如此。

暫無
暫無

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

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