如何在.NET API中整合适配SPA与守护程序应用的Azure AD B2C认证
解决方案
该需求完全可以实现,通过.NET Core自带的多JWT认证方案配置即可完成,步骤如下:
1. 配置多认证方案
修改Startup.cs(.NET 6+则是Program.cs)的认证服务注册代码,给两种认证方式分别指定独立的方案名称,避免默认方案冲突:
services.AddAuthentication(options => { // 可根据需求指定默认认证方案,也可后续通过策略/特性单独指定 options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) // 注册守护程序应用对应的Azure AD认证方案,指定唯一方案名 .AddJwtBearer("DaemonAzureAD", opt => { opt.Audience = Configuration["AAD:ResourceId"]; opt.Authority = $"{Configuration["AAD:Instance"]}{Configuration["AAD:TenantId"]}"; }) // 注册SPA应用对应的Azure AD B2C认证方案,指定唯一方案名 .AddMicrosoftIdentityWebApi(options => { Configuration.Bind("AzureAdB2C", options); options.TokenValidationParameters.NameClaimType = "name"; }, options => { Configuration.Bind("AzureAdB2C", options); }, jwtBearerScheme: "B2CAuthentication");
2. 配置统一授权策略
新增同时支持两种认证方案的授权策略,避免每个接口都重复指定方案:
services.AddAuthorization(options => { options.AddPolicy("AllClientAllowed", policy => { // 同时允许两种认证方案的合法Token访问 policy.AddAuthenticationSchemes("DaemonAzureAD", "B2CAuthentication"); policy.RequireAuthenticatedUser(); // 可在此处补充额外权限校验规则,如要求特定Scope、角色等 }); });
3. 应用认证规则
有两种使用方式,可根据业务需求选择:
全局生效(所有接口都允许两种客户端调用)
给控制器全局添加授权过滤器,所有接口默认使用统一策略:
services.AddControllers(options => { var globalPolicy = new AuthorizationPolicyBuilder("DaemonAzureAD", "B2CAuthentication") .RequireAuthenticatedUser() .Build(); options.Filters.Add(new AuthorizeFilter(globalPolicy)); });
按需指定(部分接口仅允许特定客户端调用)
不需要全局配置,直接在Controller或Action上通过[Authorize]特性指定即可:
// 允许两种客户端调用的接口 [Authorize(Policy = "AllClientAllowed")] [ApiController] [Route("api/common")] public class CommonController : ControllerBase { // 接口实现 } // 仅允许守护程序调用的接口 [Authorize(AuthenticationSchemes = "DaemonAzureAD")] [ApiController] [Route("api/daemon-only")] public class DaemonOnlyController : ControllerBase { // 接口实现 } // 仅允许SPA用户调用的接口 [Authorize(AuthenticationSchemes = "B2CAuthentication")] [ApiController] [Route("api/spa-only")] public class SpaOnlyController : ControllerBase { // 接口实现 }
注意事项
- appsettings.json无需调整,保留原有
AAD和AzureAdB2C两个配置节点即可 - 中间件顺序必须保持
UseAuthentication在前、UseAuthorization在后,否则认证逻辑不会生效 - 请确保两种认证方式的Audience配置正确,守护程序Token的受众对应AAD注册的API资源ID,B2C Token的受众对应B2C注册的API客户端ID,否则会触发401错误
内容的提问来源于stack exchange,提问作者AnnR
相关产品推荐
相关产品推荐

