首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AADSTS50013:断言对象声明不匹配所需的值

AADSTS50013:断言对象声明不匹配所需的值
EN

Stack Overflow用户
提问于 2017-03-20 07:15:45
回答 2查看 7.9K关注 0票数 2

我有一个页面应用程序,可以使用adal-angular.js/adal.js客户端在Azure中验证用户。

返回的令牌被插入到auth报头中,并传递给一个web服务器。此web使用代理工作流(https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof)为应用程序生成一个新的访问令牌,然后使用该令牌调用下游api API1。因此下游API然后重复这个过程,以获得一个新的令牌来调用另一个API API2。就在这一点上,我得到了上面的错误。

从客户端传递到服务器的令牌中的aud值是服务器应用程序的应用程序id。从服务器传递到API1的令牌中的aud值是API1应用程序的应用程序URI。到目前一切尚好。

当我在AcquireTokenAsync应用程序中调用API1时,会得到以下错误:

AADSTS70002:验证凭据错误。AADSTS50013:断言对象声明不匹配所需的值。断言中的受众是'http://application_uri.com/‘,预期的受众是'snip-a1d5-e82e84f4e19e’或该应用程序的应用程序Uris之一,其中一个应用程序ID为'snip-a1d5-e82e84f4e19e'

来自API1的相关代码

代码语言:javascript
复制
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":"网址:

如果我将上面的内容更改为将令牌中的"aud“值作为appId在ClientCredential中使用,则会得到以下错误:

'http://application_uri.com/'.:用户或管理员未同意使用ID为的应用程序。向此用户和资源发送交互式授权请求。

我做得对吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-22 05:00:58

为了完成这项工作,我必须向API1 for AP2添加以下委托权限。Azure权限

票数 -1
EN

Stack Overflow用户

发布于 2017-03-21 06:40:42

AADSTS70002:验证凭据错误。AADSTS50013:断言对象声明不匹配所需的值。断言中的听众是'uri.com/‘,预期的受众是'snip-a1d5-e82e84f4e19e’,或者是该应用程序的应用Uris之一,其中之一是App 'snip-a1d5-e82e84f4e19e‘。

要使用代理流,我们需要为 API1 提供访问令牌,并提供clientIdsecrect of API1来请求API2的访问令牌。

AADSTS65001:用户或管理员未同意使用ID为“uri.com/”的应用程序。向此用户和资源发送交互式授权请求。

在租户用户使用该应用程序之前,必须先通过权限授予向该租户注册相应的服务主体。API2是否不在用户登录的租户中?

如果我正确理解,我们需要使用SPA的knownClientApplications client_id在SPA的清单(uri.com/‘)中指定API1,它还需要将API1的权限设置为SPA。在此之后,当用户登录你的SPA时,API1应用程序也将注册给用户的租户。

有关多层应用程序的更多详细信息,请参阅以下文档:

如何使用多租户应用程序模式在任何Azure Active (AD)用户中签名

更新(附加测试结果以解释)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42897784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档