Azure AD 得到错误的令牌版本

Azure AD getting wrong token version

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

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

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

AADSTS70002: Error validating credentials. AADSTS500137: The token issuer doesn't match the api version: A version 1 token cannot be used with the v2 endpoint. Trace ID: 42aaa5f8-0a2c-4c3f-a593-1676fd662700 Correlation ID: efe97d3a-ca2f-4dfe-a50c-5c3f4accde9a Timestamp: 2019-01-20 15:52:16Z

这里

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

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

在 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

终于成功了。

所以,我们有: 本机客户端(名称:WpfApp)、网络 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

我也遇到了同样的错误,终于弄明白了。如果您从 Azure AD 应用程序注册预览中添加客户端应用程序,它将为您提供 v1.0 访问令牌,我使用 https://apps.dev.microsoft.com/ 创建了一个新客户端,它正在返回 v2.0 端点。至少对我有用。

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