【问题标题】:Azure AD getting wrong token versionAzure AD 获取错误的令牌版本
【发布时间】:2019-06-14 03:34:49
【问题描述】:

我的申请基于this example 我在我的 wpf 申请表登录名和密码中收到令牌,如下所示:

result = await _app.AcquireTokenByUsernamePasswordAsync(Scopes, username, securePassword);

然后我想访问我的安全 Web api。 但是当我尝试访问时,我得到了

AADSTS70002:验证凭据时出错。 AADSTS500137:令牌 issuer 与 api 版本不匹配:无法使用版本 1 令牌 使用 v2 端点。跟踪 ID:42aaa5f8-0a2c-4c3f-a593-1676fd662700 相关 ID:efe97d3a-ca2f-4dfe-a50c-5c3f4accde9a 时间戳: 2019-01-20 15:52:16Z

这里

AuthenticationResult result = application.AcquireTokenOnBehalfOfAsync(scopes.Except(_scopesRequestedByMsalNet), userAssertion).GetAwaiter().GetResult();

我刚刚发现的是,AcquireTokenOnBehalfOfAsync 为不同的注册本机应用程序提供了 v1 或 v2。我在 azure 上找不到 2 个应用程序之间的配置差异。

【问题讨论】:

  • 您采取了哪些措施来解决问题?您收到了特定的错误消息。您是否考虑过解决该错误?
  • 您正在从 V1 端点 (ADAL) 请求令牌并尝试将其与使用 V2 端点 (MSAL) 的应用程序一起使用。
  • @camiloterevinto 我猜这里设置了端点版本 _app = new PublicClientApplication(aadClientId, authority); 权限是“login.microsoftonline.com/organizations/v2.0
  • @danielmann 更好地问我我没有做什么:)

标签: c# azure asp.net-web-api2 azure-active-directory


【解决方案1】:

在 Azure 门户中,App registrations (Preview) 是在 v2 端点注册一个应用,App registrations 是在 v1 端点注册一个应用.

v1 授权端点是这样的:

> https://login.microsoftonline.com/tenantid/oauth2/authorize?

v1 令牌端点:

https://login.microsoftonline.com/tenantid/oauth2/token

v2 授权端点是:

https://login.microsoftonline.com/tenantid/oauth2/v2.0/authorize

v2 令牌端点是:

https://login.microsoftonline.com/tenantid/oauth2/v2.0/token

【讨论】:

  • 刚刚检查过:应用注册(预览版)、公共客户端(移动和桌面)重定向 url - localhost。然后我不得不通过编辑清单(allowPublicClient:true)手动将其更改为本地客户端。然后我在我的应用程序中检查了它 - AcquireTokenByUsernamePasswordAsync 提供 v1 令牌(在 jwt.ms 中检查)
  • @amplifier,您可以将 v1 令牌端点更改为 v2 端点。
  • 怎么样?请问你能帮帮我吗?我使用 Authority=login.microsoftonline.com/organizations/v2.0 p.s. 创建 PublicClientApplication看来 v2 只能通过apps.dev.microsoft.com 注册。但我可以肯定地说,我设法通过 portal.azure.com 注册了 v2
  • 在 azure 门户中,应用注册(预览版)也适用于我提到的 v2 应用。您可以通过apps.dev.microsoft.com 检查应用清单中的accessTokenAcceptedVersion 值是否为2。如果值为 null 或 1,则意味着您的应用程序将只接受 v1 令牌。为此,您需要手动将其更改为 2 以接受 v2 令牌。
  • 将其从 null 更改为 2,AcquireTokenByUsernamePasswordAsync 仍然提供 v1 令牌。顺便说一句,从 AcquireTokenByUsernamePasswordAsync 给我 v2 令牌的应用程序 ID 在其清单中有 accessTokenAcceptedVersion
【解决方案2】:

我得到了同样的错误,最后我想通了。如果您从 Azure AD 应用注册预览添加客户端应用,它将为您提供 v1.0 访问令牌,我使用 https://apps.dev.microsoft.com/ 创建了一个新客户端,它返回 v2.0 端点。至少它对我有用。

参考下图,我在融合应用程序下的 Angular 应用程序给了我 v2.0 令牌和 azure 广告应用程序下的 traffic-lightapp-test 给了我 v1.0 令牌

【讨论】:

    【解决方案3】:

    终于搞定了。

    那么,我们有什么: 原生客户端(名称:WpfApp)、web api(名称:WebApiApp)

    现在我们要使用登录名、密码和范围来获取访问令牌!

    假设我们的配置是:

    <add key="ida:AADInstance" value="https://login.microsoftonline.com/{0}/v2.0"/>
    <add key="ida:Tenant" value="organizations"/>
    <add key="ida:ClientId" value="xxx-xxx-xxx-xxx"/>
    <add key="todo:TodoListScope" value="https://ourdomain.onmicrosoft.com/WebApiApp/access_as_user"/>
    

    要使其正常工作,您需要在 WpfApp 清单(不仅仅是在 WebApiApp 清单中)设置 accessTokenAcceptedVersion:2

    【讨论】:

    • 谢谢,它可以帮助你。你可以标记你的答案。
    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 2019-09-15
    • 2023-03-11
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2019-04-07
    相关资源
    最近更新 更多