如何为Microsoft Identity Web Api绑定Azure AD与AzureADB2C双配置项?
实现多身份认证服务(Azure AD + Azure AD B2C)的配置方案
完全可以绑定两个配置项,通过注册多个身份认证方案分别对应Azure AD和Azure AD B2C服务即可实现需求。以下是具体实现步骤:
1. 配置appsettings.json
在配置文件中添加两个独立的节点,分别对应内网Azure AD和外网Azure AD B2C的参数:
{ "AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "你的内网租户域名", "TenantId": "内网租户ID", "ClientId": "内网API客户端ID", "Audience": "api://内网API标识" }, "AzureAdB2C": { "Instance": "https://你的B2C租户.b2clogin.com/", "Domain": "你的B2C租户域名.onmicrosoft.com", "TenantId": "B2C租户ID", "ClientId": "外网API客户端ID", "Audience": "api://外网API标识", "SignUpSignInPolicyId": "B2C_1_你的注册登录策略ID" } }
2. 注册多认证方案
在Program.cs(或Startup.cs)中分别注册两个认证方案,每个方案绑定对应的配置项:
builder.Services.AddAuthentication() // 注册Azure AD认证方案,指定方案名称为"AzureADScheme" .AddMicrosoftIdentityWebApi(options => { builder.Configuration.Bind("AzureAd", options); options.Events = new JwtBearerEvents(); options.SaveToken = true; }, options => { builder.Configuration.Bind("AzureAd", options); }, "AzureADScheme") // 注册Azure AD B2C认证方案,指定方案名称为"AzureADB2CScheme" .AddMicrosoftIdentityWebApi(options => { builder.Configuration.Bind("AzureAdB2C", options); options.Events = new JwtBearerEvents(); options.SaveToken = true; }, options => { builder.Configuration.Bind("AzureAdB2C", options); }, "AzureADB2CScheme"); // 配置授权策略,支持两种认证方案 builder.Services.AddAuthorization(options => { // 默认策略允许两种方案的认证用户访问 options.DefaultPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .AddAuthenticationSchemes("AzureADScheme", "AzureADB2CScheme") .Build(); // 也可以自定义细分策略,比如仅允许Azure AD用户访问的策略 options.AddPolicy("InternalOnly", policy => policy.AddAuthenticationSchemes("AzureADScheme") .RequireAuthenticatedUser()); });
3. 在控制器中指定认证方案
可以在控制器或Action级别指定使用的认证方案:
// 内网接口,仅允许Azure AD认证用户访问 [Authorize(AuthenticationSchemes = "AzureADScheme")] [ApiController] [Route("api/internal")] public class InternalController : ControllerBase { // 接口逻辑 } // 外网接口,仅允许Azure AD B2C认证用户访问 [Authorize(AuthenticationSchemes = "AzureADB2CScheme")] [ApiController] [Route("api/external")] public class ExternalController : ControllerBase { // 接口逻辑 }
如果需要根据请求自动判断(比如根据域名、路径),可以自定义中间件或授权策略来动态选择认证方案。
内容的提问来源于stack exchange,提问作者user3767641
相关产品推荐
相关产品推荐

