![](/img/trans.png)
[英]Discord api returns 401 unauthorized when trying signin via Azure AD B2C custom policy
[英]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.