如何在.NET 7 Blazor的Microsoft身份认证方案下实现匿名健康检查?
解决Blazor Server健康检查端点匿名访问问题
问题出在两个关键环节:中间件顺序错误和全局授权策略的覆盖,按以下步骤修改即可解决:
1. 修正中间件执行顺序
ASP.NET Core的中间件顺序直接决定请求处理流程,UseRouting必须在UseAuthentication和UseAuthorization之前执行——这样才能先匹配到目标端点,再根据端点的授权配置执行认证逻辑。
将原代码中的中间件顺序调整为:
app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization();
2. 为健康检查端点显式允许匿名
由于你设置了options.FallbackPolicy = options.DefaultPolicy;,全局所有未明确配置授权规则的端点都会默认要求认证。因此需要为/_health端点显式添加匿名访问权限:
修改健康检查的映射代码:
app.MapHealthChecks("/_health").AllowAnonymous();
或者更明确地指定授权规则(效果一致):
app.MapHealthChecks("/_health") .RequireAuthorization(auth => auth.AllowAnonymous());
修改后的完整Program.cs代码
WebApplicationBuilder builder = WebApplication.CreateBuilder(args); builder.Services .AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { builder.Configuration.Bind("AzureAd", options); options.Events.OnRedirectToIdentityProvider = context => { context.ProtocolMessage.MaxAge = "0"; return Task.CompletedTask; }; options.Events.OnRemoteSignOut = context => { context.Response.Redirect("/"); return Task.CompletedTask; }; }); builder.Services.AddControllersWithViews().AddMicrosoftIdentityUI(); builder.Services.AddAuthorization(options => { options.FallbackPolicy = options.DefaultPolicy; options.AddPolicy("ApplicationAuthorizedPolicy", policy => policy.Requirements.Add(new ApplicationAuthorizationRequirement())); }); builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor().AddMicrosoftIdentityConsentHandler(); builder.Services.AddLocalization(); builder.Services.AddScoped<IAuthorizationHandler, ApplicationAuthorizationHandler>(); builder.Services.AddScoped<IAuthorizationHandler, ClientDataAuthorizationHandler>(); // Add Health Checks builder.Services.AddHealthChecks(); var app = builder.Build(); app.UseRequestLocalization("en-US"); // 修正后的中间件顺序 app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); // 为健康检查端点添加匿名访问权限 app.MapHealthChecks("/_health").AllowAnonymous(); app.Run();
原理说明
- 调整中间件顺序后,请求会先完成路由匹配,识别出当前请求的是健康检查端点,再执行认证授权逻辑。
AllowAnonymous()会覆盖全局的fallback认证策略,明确允许该端点无需身份验证即可访问,避免被重定向到身份提供商。
内容的提问来源于stack exchange,提问作者hasherr
相关产品推荐
相关产品推荐

