我有一个单页应用程序,它使用 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/”的应用程序。为此用户和资源发送交互式授权请求。
我这样做对吗?谢谢。