You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询ADAL.js配置SPA端点时将ClientId作为受众的问题

关于AngularJS + ADAL.js对接Azure AD保护API的受众配置疑问解答

嘿,我来帮你理清这个配置问题!针对你提到的“在配置SPA端点时将ClientId作为受众”的疑问,结合你的技术栈(AngularJS 1.6.9 + ADAL.js 1.0.17 + ASP.NET Core 2.0 API),我整理了以下关键要点:

核心结论:受众(Audience)该设成什么?

简单来说:SPA的受众不应该是自身的ClientId,而应该是你要调用的目标API的标识(应用ID URI 或 API的ClientId)。

原因很直接:ADAL.js获取的令牌是用来让SPA访问受保护API的,所以令牌的受众必须和API在Azure AD中注册的标识一致,这样API才能验证令牌的合法性。

ADAL.js的正确配置示例

首先,你的SPA自身的ADAL初始化配置里,clientId填SPA的客户端ID,而在调用API时,需要指定目标API的resource(也就是受众):

1. 初始化ADAL

angular.module('yourApp', ['AdalAngular'])
    .config(['adalAuthenticationServiceProvider', '$httpProvider', function (adalProvider, $httpProvider) {
        adalProvider.init({
            clientId: '你的SPA客户端ID', // 这里是SPA自己的ClientId
            tenant: '你的Azure AD租户ID或域名',
            redirectUri: window.location.origin + '/',
            cacheLocation: 'localStorage', // 推荐用localStorage避免页面刷新丢失令牌
            endpoints: {
                // 映射API地址到对应的resource(API标识),ADAL会自动为这些请求附加令牌
                'https://your-api-1-url.com/': 'API1的应用ID URI或ClientId',
                'https://your-api-2-url.com/': 'API2的应用ID URI或ClientId'
            }
        }, $httpProvider);
    }]);

2. 手动获取令牌(如果需要)

如果不是通过endpoints自动映射,也可以手动获取令牌并附加到请求头:

adalAuthenticationService.acquireToken('API的应用ID URI或ClientId')
    .then(function(token) {
        $http.defaults.headers.common.Authorization = `Bearer ${token}`;
        // 发起API请求
        $http.get('https://your-api-url.com/api/data');
    })
    .catch(function(error) {
        console.error('获取令牌失败:', error);
    });

ASP.NET Core API的对应配置

要确保API的认证配置和ADAL的resource一致,这样API才能正确验证令牌:

// Startup.cs 中的ConfigureServices方法
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = "https://login.microsoftonline.com/你的租户ID"; // v1端点
        options.Audience = "API的应用ID URI或ClientId"; // 和ADAL里的resource完全一致
        options.TokenValidationParameters = new TokenValidationParameters
        {
            // 如果需要验证角色/组,确保开启相关验证
            ValidateIssuer = true,
            ValidateAudience = true,
            RoleClaimType = "roles", // 对应Azure AD的角色声明
            NameClaimType = "name"
        };
    });

// 别忘了在Configure方法中启用认证
app.UseAuthentication();
app.UseAuthorization();

角色和组的额外注意事项

因为你需要用到角色和组,还要确保这些配置:

  • 在Azure AD中,给SPA客户端分配目标API的应用角色(如果用应用角色),并且授予管理员同意。
  • 如果要获取用户组信息,需要在SPA的Azure AD应用注册中,配置“组声明”(选择安全组或Microsoft 365组),这样ADAL获取的令牌里会包含组ID或组名称。
  • API端要确保能正确读取令牌中的roles或groups声明,用来做权限控制。

再回到你的疑问:把ClientId作为受众可行吗?

只有一种情况可行:如果你的目标API没有设置应用ID URI(在Azure AD应用注册的“公开API”标签页里),这时候可以用API的ClientId作为受众。但前提是ADAL里的resource和API的Audience都设置成这个API的ClientId,而不是SPA的ClientId。

如果误把SPA的ClientId作为受众,API会拒绝令牌,因为令牌的受众和API的标识不匹配。

内容的提问来源于stack exchange,提问作者BgRva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:53:32