如何在.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
相关产品推荐
相关产品推荐

