【发布时间】:2018-06-23 22:44:46
【问题描述】:
我必须制作一个使用 Microsoft Graph 资源的 ASP.NET Core 2.0 Web API 应用程序。我试图让应用程序使用具有以下属性的 JWT 身份验证:
Audience: "CLIENT_ID";
Authority: "https://login.microsoftonline.com/TENANT_ID"
这里的想法是我有一个 SPA 应用程序,它使用 ADAL 获取访问令牌,该令牌应该用于 Web API 中的身份验证。获取的令牌在 Microsoft Graph 请求中成功进行身份验证,但未通过 JWT 身份验证。未经授权的响应错误是:
签名无效
这是反序列化的令牌:
{
"typ": "JWT",
"nonce": "AQABAAAAAABHh4kmS_aKT5XrjzxRAtHzXF_CqRIDpjJHoJWBZWfqGU15M5j1xqsBga7obz1SUDjg3Ft56m4bTqls5nSs1T0ymPVzRTHZ7osxohQx9iRClSAA",
"alg": "RS256",
"x5t": "z44wMdHu8wKsumrbfaK98qxs5YI",
"kid": "z44wMdHu8wKsumrbfaK98qxs5YI"
}.{
"aud": "https://graph.microsoft.com",
"iss": "https://sts.windows.net/TENANT_ID/",
"iat": 1515769573,
"nbf": 1515769573,
"exp": 1515773473,
"acr": "1",
"aio": "Y2NgYHjhxRdU0DHj52u1ANkNv4qnVYoUbA2vYDu/dHHH1UcTUiwA",
"amr": [
"pwd"
],
"app_displayname": "APP_NAME",
"appid": "CLIENT_ID",
"appidacr": "0",
"e_exp": 262800,
"ipaddr": "80.72.72.11",
"name": "NAME",
"oid": "USER_ID",
"platf": "3",
"puid": "1003BFFDA650568E",
"scp": "Directory.ReadWrite.All EduAssignments.ReadWrite Mail.Send User.Read User.ReadBasic.All User.ReadWrite.All",
"sub": "60Oat50bmTi24tObKrBPrjIpotUdZkUl5h0x0I6dLi0",
"tid": "TENANT_ID",
"unique_name": "UNIQUE_NAME",
"upn": "UPN",
"uti": "9z7lfwGNmkmqEO7KpWcKAA",
"ver": "1.0"
}.[Signature]
Jwt.ms 说它是 Azure AD V1.0 令牌。所以它应该有点有效。我尝试使用 MSAL 获取 Azure AD V2.0 令牌,该令牌在 Web API 中成功进行身份验证,但在尝试发出图形请求时失败。我做错了什么?
编辑 我将配置更改为再次使用 v2.0 令牌,然后尝试使用@juunas 的指南来获取这样的图形访问令牌:
var userAssertion = new UserAssertion(token, assertionType, email);
var authContext = new AuthenticationContext("https://login.microsoftonline.com/common/v2.0");
var clientCredential = new ClientCredential("CLIENT_ID", "CLIENT_SECRET");
//Acquire access token
var result = await authContext.AcquireTokenAsync("https://graph.microsoft.com", clientCredential, userAssertion);
string graphToken = result.AccessToken;
但是 AcquireTokenAsyncMethod 抛出以下错误:
令牌发行者与 api 版本不匹配:版本 2 令牌可以 仅与 v2 端点一起使用
我觉得这很奇怪,因为现在所有内容都针对 v2.0 进行了配置,而且我的令牌是具有颁发者的有效 Azure AD v2.0 令牌:https://login.microsoftonline.com/TENANT_ID/v2.0
【问题讨论】:
-
您在此处显示的访问令牌具有
aud: https://graph.microsoft.com。这意味着此令牌仅适用于 MS Graph API。您的 API 需要单独的访问令牌。如果您在 Azure 门户中注册了 API,则需要从 V1 端点获取它。如果您在位于 apps.dev.microsoft.com 的新应用门户中注册了它,那么您需要使用 V2 端点。 -
@juunas 有没有一种方法可以将单个令牌用于 Microsoft Graph 和 Azure AD Auth?
-
如果您的意思是 MS Graph 和您的 API 的单个令牌,不。令牌仅适用于一个 API。你需要两个令牌。
-
如果您的 API 需要调用 MS Graph,您必须将 API 中的访问令牌换成 MS Graph 的令牌,例如:joonasw.net/view/azure-ad-on-behalf-of-aspnet-core
-
这太糟糕了。实际上,我已经使用了两个令牌,但使用单个令牌会简化一切,所以我不得不尝试。谢谢!
标签: c# jwt azure-active-directory microsoft-graph-api asp.net-core-2.0