.NET 7多认证提供者:本地JWT验证通过后跳过Azure AD验证
解决方案
1. 配置组合认证策略实现短路逻辑
创建一个组合认证方案作为默认认证方式,让系统优先验证LocalJWT,验证成功则终止后续认证流程;仅当LocalJWT验证失败时,才尝试Azure AD认证。这样既满足“本地JWT通过后不触发Azure AD验证”的需求,又能避免启动时加载Azure AD元数据。
在Program.cs中添加以下配置:
// 配置LocalJWT认证方案 builder.Services.AddAuthentication("CombinedAuth") .AddJwtBearer("LocalJWT", options => { // 填入你的LocalJWT验证参数 options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidateAudience = true, ValidAudience = builder.Configuration["Jwt:Audience"], ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])) }; }) // 配置Azure AD认证方案 .AddMicrosoftIdentityWebApi("AzureAD", builder.Configuration, "AzureAd") // 添加组合策略方案 .AddPolicyScheme("CombinedAuth", "Combined Authentication", options => { options.ForwardDefaultSelector = async context => { // 先尝试LocalJWT认证 var localAuthResult = await context.HttpContext.AuthenticateAsync("LocalJWT"); if (localAuthResult.Succeeded) { // LocalJWT验证成功,直接使用该方案,终止后续流程 return "LocalJWT"; } // LocalJWT验证失败,尝试Azure AD认证 return "AzureAD"; }; });
2. 禁用Azure AD启动时的元数据加载
为彻底解决启动时的元数据获取错误,修改Azure AD的JWT Bearer选项,让其仅在被实际调用时才加载元数据,并针对开发环境做特殊配置:
// 调整Azure AD认证选项 builder.Services.PostConfigure<JwtBearerOptions>("AzureAD", options => { // 开发环境禁用HTTPS元数据要求(生产环境需改回true) if (builder.Environment.IsDevelopment()) { options.RequireHttpsMetadata = false; } // 延长元数据自动刷新间隔,避免启动时立即请求远程地址 options.AutomaticRefreshInterval = TimeSpan.FromDays(7); });
3. 配置授权策略
确保授权策略使用默认的组合认证方案,无需额外指定两种方案:
builder.Services.AddAuthorization(options => { options.DefaultPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); });
额外说明
- 开发环境下,只要请求携带有效的LocalJWT,就不会触发Azure AD的验证逻辑,自然不会出现元数据获取错误。
- 生产环境补全Azure AD租户ID、客户端ID等配置后,元数据加载会自动恢复正常,不影响功能使用。
内容的提问来源于stack exchange,提问作者AtlasPromotion
相关产品推荐
相关产品推荐

