如何为.NET Core Web API实现Azure AD认证,支持带/不带用户上下文的多客户端调用
解决方案
该需求完全可实现,你遇到的问题由两部分配置缺失导致:Azure AD端应用权限配置错误、Web API端授权策略未兼容应用身份校验,具体修复步骤如下:
1. 修复Azure AD端配置(解决令牌缺声明问题)
你看到的IDW10201报错是因为客户端凭证流返回的令牌中没有有效roles或scope声明,客户端凭证流使用应用权限而非授权码流的委托权限,需按如下配置:
- 进入Web API对应的Azure AD应用注册页,打开「应用权限」tab,点击「添加权限」-「我的API」,选中当前Web API,切换到「应用权限」分类,新增自定义应用权限(例如命名为
AccessAsApplication)并保存。 - 进入第三方客户端对应的Azure AD应用注册页,打开「应用权限」tab,添加上一步新建的Web API应用权限,点击「授予管理员同意」完成授权。
- 请求令牌时,
scope参数固定填写为api://<Web API客户端ID>/.default,grant_type固定为client_credentials,此时拿到的令牌解析后会包含roles声明,值为你定义的AccessAsApplication。
注意:客户端凭证流的令牌权限属于应用级别,泄露会导致Web API被非法访问,需严格管控第三方客户端的client secret存储、权限范围,避免授予过高权限。
2. 调整Web API代码配置
2.1 兼容应用权限校验
修改AddMicrosoftIdentityWebApi配置,关闭仅允许委托权限校验的默认限制,解决IDW10201报错:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi( jwtOpt => { jwtOpt.TokenValidationParameters.ValidAudiences = new List<string> { "api://<你的Web API客户端ID>" }; }, identityOpt => { // 允许通过应用权限(角色)授权,不再强制要求scope声明 identityOpt.AllowWebApiToBeAuthorizedByACL = true; } );
2.2 配置多场景授权策略
新增两类授权策略,分别适配SPA用户调用、第三方应用调用场景:
services.AddAuthorization(options => { // 适配原有SPA授权码流的策略:要求有用户角色声明 options.AddPolicy("UserOnlyPolicy", policy => { policy.RequireAuthenticatedUser(); // 填入你原有给用户分配的角色值 policy.RequireClaim("roles", "<原有用户角色值>"); }); // 适配客户端凭证流的策略:要求有应用权限声明 options.AddPolicy("AppOnlyPolicy", policy => { policy.RequireAuthenticatedUser(); policy.RequireClaim("roles", "AccessAsApplication"); }); });
2.3 控制器绑定对应策略
- 原有面向SPA的控制器,添加
[Authorize(Policy = "UserOnlyPolicy")]特性,确保必须有用户上下文才能访问。 - 新增的面向第三方客户端的控制器,添加
[Authorize(Policy = "AppOnlyPolicy")]特性,仅允许持有有效应用权限令牌的客户端访问。
如果你不需要对原有接口做额外角色校验,保留原有全局RequireAuthenticatedUser策略即可,两类请求只要完成身份认证都会自动放行。
内容的提问来源于stack exchange,提问作者Mr Perfect
相关产品推荐
相关产品推荐

