繁体   English   中英

Asp.Net Core Azure AD V1.0 JWT身份验证无效签名

[英]Asp.Net Core Azure AD V1.0 JWT Authentication Invalid Signature

我必须制作一个使用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 Requests中成功进行身份验证,但未通过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

您需要为API提供单独的访问令牌。

来自Azure AD的访问令牌始终仅用于单个API /资源。

另外,如果您需要从您的API调用MS Graph API,则可能需要研究On-Behalf-Of授权: https : //joonasw.net/view/azure-ad-on-behalf-of-aspnet-核心

该流程的基本思想是,当您的API收到包含具有用户上下文的访问令牌的调用时,您可以将该令牌+ API的凭据交换为另一个仍具有相同用户上下文的API的新访问令牌。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM