咨询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
相关产品推荐
相关产品推荐

