AADSTS50013:断言受众声明与所需值不匹配
AADSTS50013: Assertion audience claim does not match the required value
我有一个单页应用程序,它使用 adal-angular.js/adal.js [客户端].
对 Azure 中的用户进行身份验证
返回的令牌被插入 auth header 并传递到网络 API [服务器]。此网站 api 使用 on-behalf-of 工作流程 (https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof) 为应用程序生成新的访问令牌
然后使用此令牌调用下游 API [API1]。
所以下游 API 然后重复这个过程来获得一个新的令牌来调用另一个 API [API2]。正是在这一点上,我收到了上述错误。
从[客户端]传递给[服务器]的令牌中的aud值是[服务器]应用程序的应用程序ID。
从 [server] 传递到 [API1] 的令牌中的 aud 值是 [API1] 应用程序的应用程序 URI。
到目前为止一切顺利。
当我在 [API1] 应用程序中调用 AcquireTokenAsync 时,出现以下错误:
AADSTS70002:验证凭据时出错。 AADSTS50013:断言受众声明与所需值不匹配。断言中的受众是 'http://application_uri.com/',预期受众是“snip-a1d5-e82e84f4e19e”或应用程序 ID 为“[=32=”的此应用程序的应用程序 Uris 之一]snip-a1d5-e82e84f4e19e'
相关代码来自[API1]:
public static async Task<string> GetApplicationTokenOnBehalfOfUser(string appId, string appKey)
{
var clientCredential = new ClientCredential(appId, appKey);
var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as
System.IdentityModel.Tokens.BootstrapContext;
var userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;
var userAccessToken = bootstrapContext.Token;
var userAssertion = new UserAssertion(userAccessToken, _assertionType, userName);
var authority = string.Format(System.Globalization.CultureInfo.InvariantCulture, _aadInstance, _tenant);
var userId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
var authContext = new AuthenticationContext(authority, new TokenCache());
var result = await authContext.AcquireTokenAsync(_resourceId, clientCredential, userAssertion);
var accessToken = result.AccessToken;
return accessToken;
}
在哪里:
appId = "snip-a1d5-e82e84f4e19e"
而 BootstrapContext.Token 中的 "aud" 值是:
"aud": "http://application_uri.com/"
如果我将以上内容更改为使用令牌中的 "aud" 值作为 ClientCredential 中的 appId,则会收到此错误:
AADSTS65001:用户或管理员未同意使用 ID 为 'http://application_uri.com/' 的应用程序。为此用户和资源发送交互式授权请求。
我这样做对吗?
谢谢
AADSTS70002: Error validating credentials. AADSTS50013: Assertion audience claim does not match the required value. The audience in the assertion was 'http://application_uri.com/' and the expected audience is 'snip-a1d5-e82e84f4e19e' or one of the Application Uris of this application with App ID 'snip-a1d5-e82e84f4e19e'
要使用代理流,我们需要为 API1 提供访问令牌并提供 clientId 和API1 的 secrect 请求 API2 的访问令牌。
AADSTS65001: The user or administrator has not consented to use the application with ID 'http://application_uri.com/'. Send an interactive authorization request for this user and resource.
在租户用户可以使用该应用程序之前,必须先通过权限授予将相应的服务主体注册到该租户。 API2是不是在用户登录的租户中?
如果我没理解错的话,我们需要在 API1(http://application_uri.com/') 的清单中指定 knownClientApplications
和 client_id您的SPA,它还需要将API1的权限设置为SPA。之后,当用户登录你的SPA时,API1应用也会注册到用户的租户。
有关多层应用程序的更多详细信息,请参阅以下文档:
How to sign in any Azure Active Directory (AD) user using the multi-tenant application pattern
更新(附测试结果说明)
为了使这项工作正常进行,我必须为 AP2 的 API1 添加以下委派权限。
Azure Permissions
我有一个单页应用程序,它使用 adal-angular.js/adal.js [客户端].
对 Azure 中的用户进行身份验证
返回的令牌被插入 auth header 并传递到网络 API [服务器]。此网站 api 使用 on-behalf-of 工作流程 (https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof) 为应用程序生成新的访问令牌
然后使用此令牌调用下游 API [API1]。
所以下游 API 然后重复这个过程来获得一个新的令牌来调用另一个 API [API2]。正是在这一点上,我收到了上述错误。
从[客户端]传递给[服务器]的令牌中的aud值是[服务器]应用程序的应用程序ID。 从 [server] 传递到 [API1] 的令牌中的 aud 值是 [API1] 应用程序的应用程序 URI。 到目前为止一切顺利。
当我在 [API1] 应用程序中调用 AcquireTokenAsync 时,出现以下错误:
AADSTS70002:验证凭据时出错。 AADSTS50013:断言受众声明与所需值不匹配。断言中的受众是 'http://application_uri.com/',预期受众是“snip-a1d5-e82e84f4e19e”或应用程序 ID 为“[=32=”的此应用程序的应用程序 Uris 之一]snip-a1d5-e82e84f4e19e'
相关代码来自[API1]:
public static async Task<string> GetApplicationTokenOnBehalfOfUser(string appId, string appKey)
{
var clientCredential = new ClientCredential(appId, appKey);
var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as
System.IdentityModel.Tokens.BootstrapContext;
var userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;
var userAccessToken = bootstrapContext.Token;
var userAssertion = new UserAssertion(userAccessToken, _assertionType, userName);
var authority = string.Format(System.Globalization.CultureInfo.InvariantCulture, _aadInstance, _tenant);
var userId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
var authContext = new AuthenticationContext(authority, new TokenCache());
var result = await authContext.AcquireTokenAsync(_resourceId, clientCredential, userAssertion);
var accessToken = result.AccessToken;
return accessToken;
}
在哪里: appId = "snip-a1d5-e82e84f4e19e"
而 BootstrapContext.Token 中的 "aud" 值是: "aud": "http://application_uri.com/"
如果我将以上内容更改为使用令牌中的 "aud" 值作为 ClientCredential 中的 appId,则会收到此错误:
AADSTS65001:用户或管理员未同意使用 ID 为 'http://application_uri.com/' 的应用程序。为此用户和资源发送交互式授权请求。
我这样做对吗? 谢谢
AADSTS70002: Error validating credentials. AADSTS50013: Assertion audience claim does not match the required value. The audience in the assertion was 'http://application_uri.com/' and the expected audience is 'snip-a1d5-e82e84f4e19e' or one of the Application Uris of this application with App ID 'snip-a1d5-e82e84f4e19e'
要使用代理流,我们需要为 API1 提供访问令牌并提供 clientId 和API1 的 secrect 请求 API2 的访问令牌。
AADSTS65001: The user or administrator has not consented to use the application with ID 'http://application_uri.com/'. Send an interactive authorization request for this user and resource.
在租户用户可以使用该应用程序之前,必须先通过权限授予将相应的服务主体注册到该租户。 API2是不是在用户登录的租户中?
如果我没理解错的话,我们需要在 API1(http://application_uri.com/') 的清单中指定 knownClientApplications
和 client_id您的SPA,它还需要将API1的权限设置为SPA。之后,当用户登录你的SPA时,API1应用也会注册到用户的租户。
有关多层应用程序的更多详细信息,请参阅以下文档:
How to sign in any Azure Active Directory (AD) user using the multi-tenant application pattern
更新(附测试结果说明)
为了使这项工作正常进行,我必须为 AP2 的 API1 添加以下委派权限。 Azure Permissions