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 令牌
我的申请基于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 令牌