2

我有一个单页应用程序,它使用 adal-angular.js/adal.js [client] 对 Azure 中的用户进行身份验证。
返回的令牌插入到 auth 标头中并传递给 Web API [服务器]。此 Web api 使用代表工作流 ( https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof ) 为应用程序生成一个新的访问令牌,然后此令牌用于调用下游 API [API1]。所以下游 API 然后重复这个过程来获取一个新的令牌来调用另一个 API [API2]。正是在这一点上,我收到了上述错误。

从 [client] 传递到 [server] 的令牌中的 aud 值是 [server] 应用程序的应用程序 ID。从 [server] 传递到 [API1] 的令牌中的 aud 值是 [API1] 应用程序的应用程序 URI。到现在为止还挺好。

当我在 [API1] 应用程序中调用 AcquireTokenAsync 时,我收到以下错误:

AADSTS70002:验证凭据时出错。AADSTS50013:断言受众声明与所需值不匹配。断言中的受众是“http:// application_uri .com/”,预期受众是“ snip -a1d5-e82e84f4e19e”或应用程序 ID 为“ snip -a1d5-e82e84f4e19e”的此应用程序的应用程序 Uris 之一

[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/”的应用程序。为此用户和资源发送交互式授权请求。

我这样做对吗?谢谢。

4

2 回答 2

0

AADSTS70002:验证凭据时出错。AADSTS50013:断言受众声明与所需值不匹配。断言中的受众是“ http://application_uri.com/ ”,预期受众是“snip-a1d5-e82e84f4e19e”或应用 ID 为“snip-a1d5-e82e84f4e19e”的此应用程序的应用程序 Uris 之一

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

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

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

如果我理解正确,我们需要knownClientApplications在 API1(http://application_uri.com/ ')的清单中指定您的 SPA 的client_id,并且还需要将 API1 的权限设置为 SPA。之后,当用户登录您的 SPA 时,API1 应用程序也将注册到用户的租户。

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

如何使用多租户应用程序模式登录任何 Azure Active Directory (AD) 用户

更新(附上测试结果说明)

在此处输入图像描述

于 2017-03-21T06:40:42.503 回答
-1

为了让它工作,我必须为 AP2 的 API1 添加以下委派权限。 Azure 权限

于 2017-03-22T05:00:58.033 回答