Azure AD的访问令牌颁发者是sts.windows.net,而不是login.microsoftonline.com。

31
我正在尝试验证从Azure Active Directory获取的访问令牌。
我从https://login.microsoftonline.com/{{我的租户GUID}}/v2.0获取了令牌。
令牌中返回的发行者是https://sts.windows.net//{{我的租户GUID}}/,与预期不符。
如果我检查.well-known/openid-configuration下的配置,发行者是预期的https://login.microsoftonline.com/....
我在GitHub上找到了一个类似的问题报告,链接在这里https://github.com/AzureAD/microsoft-authentication-library-for-js/issues/560
建议是在AAD中手动编辑应用程序注册中的清单JSON,并设置"accessTokenAcceptedVersion": 2
我已经这样做了,但没有任何改变。为什么?

你编辑了API的应用程序注册清单,对吧?那应该会将令牌更改为v2。 - juunas
是的,我已经为客户端和API更改了清单。 - Twisted
你能展示一下你正在使用的获取令牌的代码吗? - juunas
我刚刚准备了一个使用jwt.io发布示例令牌,该令牌现在包含了预期的发行者。例如https://login.microsoftonline.com。奇怪的是,受众已从api://myapi更改为我的clientId Guid。自发布问题以来,我没有更改任何代码,因此我只能假设设置“accessTokenAcceptedVersion”:2实际上起作用,但需要几个小时才能生效。 - Twisted
如果想通过Graph SDK编程方式设置此项,希望这个答案能够帮到您 https://dev59.com/PjsDtIcB2Jgan1znTFG_#69341905 - Paramesh Korrakuti
3个回答

25

所以,在清单(manifest)中将acceptedTokenVersion更改为2似乎确实发生了变化,但需要时间才能生效。

是的,根据我在v2令牌中的测试,受众总是基于客户端ID。


3
这个变化需要多久才能生效?我在30多分钟前做了更改,但仍然从v2端点收到v1令牌。 - Bob Meyers
2
是的,我在令牌请求中使用的应用程序注册(“客户端”)清单中设置了“accessTokenAcceptedVersion:2”。我正在使用grant_type:password,如果有影响的话。 - Bob Meyers
有没有办法以编程方式设置"accessTokenAcceptedVersion": 2,而不是手动在清单中更新? - Paramesh Korrakuti
@ParameshKorrakuti 是的,az rest --method PATCH --headers "Content-Type=application/json" --uri https://graph.microsoft.com/v1.0/applications/$app_object_id/ --body '{"api":{"requestedAccessTokenVersion": 2}}' - Ahmed El Kilani
2
我已经在清单文件中更改了超过12个小时,但发行者URL仍未更新 :( - Viki Cullen
显示剩余4条评论

4
如果您正在认证API,则在启动类中添加以下代码:
return services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
        {
            options.Authority = "https://login.microsoftonline.com/<TenantId>/v2.0";
            options.Audience = "<Audience>";
            options.TokenValidationParameters.ValidIssuer = "https://sts.windows.net/<TenantId>/";
        });

上面的代码,通知了正确的发行者。

1
嗨,我们如何从Azure获取观众和发行者?请帮助我。 - Karthic G
1
您可以在Azure B2C的应用注册中,暴露一个API并添加作用域,选择一个GUID,您的观众将是:api://{guid}。 - Fábio Rodrigues Fonseca
1
观众,您可以在Azure B2C的应用注册中暴露API并添加范围,选择一个GUID,您的观众将是:api://{guid}。 - undefined

2
更改acceptedTokenVersion2的接受答案是正确的。然而,还有一些细微之处:
- 造成生效时间较长的原因是您的客户端库(如JavaScript的MSAL)可以缓存令牌,并在一段时间内继续提供版本1的令牌。我怀疑这就是为什么接受答案和评论中提到需要几个小时才能生效的原因。
- 如果您正在使用msal-browser用于node.js,并按照这里的说明来提高性能,您需要特别注意在填写authorityMetadata时使用2.0版本的终结点。在撰写本文时,说明不完整且误导性,容易犯这个错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接