ASP.NET Core 8 Web API多租户限制Issuer遇Bearer Scheme重复问题
解决ASP.NET Core 8中JWT Issuer限制与Bearer Scheme冲突问题
错误原因
你碰到的System.InvalidOperationException: Scheme already exists: Bearer错误,核心原因是AddJwtBearer和AddMicrosoftIdentityWebApi都默认使用Bearer作为认证Scheme,重复注册同一Scheme导致冲突。
正确配置方案
方案一:直接在Azure AD认证配置中设置Issuer限制
AddMicrosoftIdentityWebApi本身基于JwtBearer实现,不需要单独调用AddJwtBearer,直接通过它的配置委托设置令牌验证参数即可:
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddAuthentication() .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"), options => { options.TokenValidationParameters.ValidateIssuer = true; options.TokenValidationParameters.ValidIssuers = new[] { "XXX", "YYY" }; // 如果需要保留Azure AD默认的租户Issuer,也可以合并进去 // var defaultIssuer = $"https://login.microsoftonline.com/{builder.Configuration["AzureAd:TenantId"]}/v2.0"; // options.TokenValidationParameters.ValidIssuers = new[] { defaultIssuer, "XXX", "YYY" }; }) .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches();
方案二:多认证Scheme共存(如需同时支持自定义JWT和Azure AD)
如果你的API需要同时支持自定义JWT和Azure AD认证,给自定义JWT指定一个独立的Scheme名称即可避免冲突:
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) // 自定义JWT使用独立Scheme .AddJwtBearer("CustomJwt", options => { options.TokenValidationParameters.ValidateIssuer = true; options.TokenValidationParameters.ValidIssuers = new[] { "XXX", "YYY" }; }) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")) .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches();
这种情况下,需要在授权时指定允许的Scheme,比如在控制器上添加:
[Authorize(AuthenticationSchemes = "CustomJwt,Bearer")]
关于之前配置无效的说明
如果你之前尝试在AddMicrosoftIdentityWebApi中配置Issuer但没效果,大概率是配置顺序问题——Azure AD会自动填充TokenValidationParameters的部分默认值,确保你的配置是在这些默认值之后设置的(比如直接在AddMicrosoftIdentityWebApi的options委托中修改,而不是单独提取配置),这样才能覆盖默认参数。
内容的提问来源于stack exchange,提问作者frmrIntern
相关产品推荐
相关产品推荐

