You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:25:20