无法访问 Azure 上的 OpenId UserInfo 端点(AADSTS90010:JWT 令牌不能与 UserInfo 端点一起使用)

Posted

技术标签:

【中文标题】无法访问 Azure 上的 OpenId UserInfo 端点(AADSTS90010:JWT 令牌不能与 UserInfo 端点一起使用)【英文标题】:Cannot access OpenId UserInfo endpoint on Azure (AADSTS90010: JWT tokens cannot be used with the UserInfo endpoint) 【发布时间】:2015-04-22 06:55:46 【问题描述】:

我正在尝试使用以下 GET 访问 Office365 Azure 租户上用户的 OpenId UserInfo 端点:

GET https://login.windows.net/common/openid/userinfo HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJ(...remainder deleted for brevity...)
Host: login.windows.net

响应失败并显示“400 Bad Request”,以及更具体的错误“AADSTS50063:凭据解析失败。AADSTS90010:JWT 令牌无法与 UserInfo 端点一起使用”

HTTP/1.1 400 Bad Request
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: text/html
Expires: -1
Server: Microsoft-IIS/8.5
x-ms-request-id: ef5c8a50-69b5-40f1-ac5f-9c0fc5180aa2
x-ms-gateway-service-instanceid: ESTSFE_IN_6
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000; includeSubDomains
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"
WWW-Authenticate: Bearer correlation_id="e5c613a0-0a21-40e1-9ef6-    eacf77580608", error="invalid_request", error_codes="[50063, 90010]",     error_description="AADSTS50063: Credential parsing failed. AADSTS90010: JWT tokens cannot be used with the UserInfo endpoint.%0d%0aTrace ID: ef5c8a50-69b5-40f1-ac5f-9c0fc5180aa2%0d%0aCorrelation ID: e5c613a0-0a21-40e1-9ef6-eacf77580608%0d%0aTimestamp: 2015-02-20 14:13:42Z", timestamp="2015-02-20 14:13:42Z", trace_id="ef5c8a50-69b5-40f1-ac5f-9c0fc5180aa2"
Set-Cookie: x-ms-gateway-slice=productionb; path=/; secure; HttpOnly
Set-Cookie: stsservicecookie=ests; path=/; secure; HttpOnly
X-Powered-By: ASP.NET
Date: Fri, 20 Feb 2015 14:13:40 GMT
Content-Length: 0

使用的不记名令牌是未过期的访问令牌,可正常用于其他操作,例如检索 Exchange 电子邮件。

此外,当我在“https://www.googleapis.com/plus/v1/people/me/openIdConnect”(作为 gmail 访问方案的一部分)对 openid userinfo 端点使用相同的 GET 时,它工作正常

我在这里做错了吗?感谢您的帮助!

一些额外的信息:

-已经尝试使用 id_token 代替 access_token,但这没有区别。

-使用的 Oauth 范围是“个人资料电子邮件”

-请求的资源是“https://outlook.office365.com/”

-客户端应用程序是本机应用程序,并已启用“Windows Azure AD”和“Office 365 Exchange Online”的所有委派权限

【问题讨论】:

【参考方案1】:

Azure AD 用户信息端点目前不支持使用常规 JWT 访问令牌。相反,您可以通过在对令牌端点的请求中不指定任何资源来获取用户信息特定的访问令牌。您可以将用户信息端点本身视为一种资源,它需要特殊的令牌格式。

例如在授权码情况下:

GET 请求到https://login.windows.net/common/oauth2/authorize?... 不带resource 参数,并获取授权码 使用授权码向https://login.windows.net/common/oauth2/token发出POST请求,也没有resource参数。接收用户信息端点的访问令牌。 对https://login.windows.net/common/openid/userinfo 的GET 请求将标头中的访问令牌作为Authorization: Bearer AAAB(...rest of token...) 传递

【讨论】:

尝试了您的方法,确实,现在我可以访问 userinfo 端点 - 谢谢。因此,我将其标记为答案。话虽如此,它似乎只有在我的应用程序访问我自己组织的租户时才有效。另一方面,当我尝试访问另一个租户时(在多租户场景中),我收到错误 AADSTS65001: No permission to access user information is configured for '...removed...' application, or it is expired或撤销。这通常是您在没有指定资源时所期望的错误... 另一个观察结果:用户信息和常规 oauth 资源的令牌不一样,并且每个都需要单独的身份验证流程(提示用户两次输入用户/密码),这不是失败了吗多资源单点登录的目的?这似乎不合逻辑,是吗? 您的应用程序是否已预先配置为请求“登录并阅读我的个人资料”权限? (您可以通过查看 Azure 管理门户上的应用程序配置页面来了解。)您是否遇到过多次登录提示?假设用户已经同意授予应用访问权限,您应该能够将代码/刷新令牌兑换为访问不同资源的令牌。 另外,请注意,当前通过用户信息端点提供的几乎所有信息都在 JWT 令牌本身的声明中可用。 看来,如果您使用 graph.microsoft.com/oidc/userinfo 作为 userinfo 端点,它确实接受 JWT 并返回用户信息。

以上是关于无法访问 Azure 上的 OpenId UserInfo 端点(AADSTS90010:JWT 令牌不能与 UserInfo 端点一起使用)的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Azure AD OpenID - 生产服务器上的令牌签名验证失败

Azure B2C:无法从 v2.0 .well-known openid-configuration 检索文档

Azure AD B2C OpenID Connect 刷新令牌

无法使用应用服务上的 Azure MSI 访问 Key Vault

无法访问 Azure VM 上的 Neo4j webadmin

外部客户端无法访问 Azure Service Fabric 上的 WCF 通信侦听器