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

如何在.NET Core Web API中适配Azure AD B2C多注册登录策略?

在.NET Core Web API中支持Azure AD B2C多认证策略方案

要让Web API同时支持Native App和SPA的不同SignUpSignInPolicyId,你需要配置多个认证方案(每个方案对应一个B2C策略),再通过授权策略关联这些方案。你之前用AddPolicy只是定义了授权规则,没有处理多策略的认证逻辑,这是核心问题。

步骤1:修改配置文件

先在appsettings.json中添加两个策略的配置,方便后续读取:

"AzureAdB2C": {
  "Instance": "https://<your-tenant-name>.b2clogin.com",
  "ClientId": "<web-app-application-id>",
  "Domain": "<your-b2c-domain>",
  "Policies": {
    "NativeAppPolicy": "<native-app-signup-signin-policy-id>",
    "SPAPolicy": "<spa-signup-signin-policy-id>"
  },
  "SignedOutCallbackPath": "/signout"
}

步骤2:配置多认证方案

在Program.cs(.NET 6+)或Startup.cs中,注册两个Azure AD B2C Bearer认证方案,分别绑定不同的策略ID:

// 注册两个独立的B2C认证方案
services.AddAuthentication()
    .AddAzureADB2CBearer("NativeAppAuthScheme", options =>
    {
        Configuration.Bind("AzureAdB2C", options);
        options.SignUpSignInPolicyId = Configuration["AzureAdB2C:Policies:NativeAppPolicy"];
    })
    .AddAzureADB2CBearer("SPAAuthScheme", options =>
    {
        Configuration.Bind("AzureAdB2C", options);
        options.SignUpSignInPolicyId = Configuration["AzureAdB2C:Policies:SPAPolicy"];
    });

步骤3:配置授权策略

根据业务需求,配置通用或专属的授权策略,关联对应的认证方案:

services.AddAuthorization(options =>
{
    // 默认策略:允许来自Native App或SPA的合法令牌
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .AddAuthenticationSchemes("NativeAppAuthScheme", "SPAAuthScheme")
        .RequireAuthenticatedUser()
        .Build();

    // Native App专属策略:仅接受Native App策略的令牌,且需要test.read权限
    options.AddPolicy("NativeAppOnly", policy =>
        policy.AddAuthenticationSchemes("NativeAppAuthScheme")
              .RequireAuthenticatedUser()
              .RequireScope("test.read"));

    // SPA专属策略:仅接受SPA策略的令牌
    options.AddPolicy("SPAOnly", policy =>
        policy.AddAuthenticationSchemes("SPAAuthScheme")
              .RequireAuthenticatedUser());
});

步骤4:在控制器中使用

根据接口的受众,选择对应的授权方式:

// 通用接口:接受两个应用的令牌
[Authorize]
[ApiController]
[Route("api/common")]
public class CommonController : ControllerBase
{
    // 接口逻辑
}

// Native App专属接口:仅允许Native App的请求
[Authorize(Policy = "NativeAppOnly")]
[ApiController]
[Route("api/native")]
public class NativeController : ControllerBase
{
    // 接口逻辑
}

// SPA专属接口:直接指定认证方案
[Authorize(AuthenticationSchemes = "SPAAuthScheme")]
[ApiController]
[Route("api/spa")]
public class SPAController : ControllerBase
{
    // 接口逻辑
}

关键说明

  • AddAuthorization中的AddPolicy是授权规则,用来限制访问资源的条件(比如权限、角色),但不负责验证令牌的合法性(这是认证方案的工作)。
  • 每个B2C策略的令牌Issuer包含策略ID,因此必须为每个策略单独配置认证方案,否则令牌验证会失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:07:35