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

如何在.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 17:30:00