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

Azure容器应用中Blazor Server无法通过HAProxy完成Entra ID认证

解决Blazor Server + Azure容器应用 + HAProxy下Entra ID认证重定向问题

核心原因

应用未正确获取外部请求的真实URL,导致生成的OIDC重定向URI使用了容器内部域名,不在Entra ID的允许列表范围内,最终触发认证失败。

具体修复步骤

1. 确保ForwardedHeaders配置前置且生效

在Program.cs中,必须将ForwardedHeaders配置放在认证逻辑之前,同时信任HAProxy所在的IP网段(Azure容器应用环境可使用内部私有网段):

var builder = WebApplication.CreateBuilder(args);

// 配置ForwardedHeaders,优先级高于认证
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost;
    // 信任Azure容器应用内部网段,生产环境建议根据HAProxy实际IP缩小范围
    options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("10.0.0.0"), 8));
});

// 配置Entra ID认证
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = options.DefaultPolicy;
});

builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor()
    .AddMicrosoftIdentityConsentHandler();

var app = builder.Build();

// 启用ForwardedHeaders中间件
app.UseForwardedHeaders();

// 后续中间件配置
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

2. 配置HAProxy正确转发关键请求头

HAProxy需要将外部请求的真实协议、域名、客户端IP通过头部转发给后端应用,示例配置片段:

frontend https_front
    bind *:443 ssl crt /path/to/your-cert.pem
    default_backend blazor_app_backend

backend blazor_app_backend
    server app_container theapp_ca.myazurecontainerenv.containerapps.com:443 ssl verify none
    http-request set-header X-Forwarded-Proto https
    http-request set-header X-Forwarded-Host my.company.internal
    http-request set-header X-Forwarded-For %[src]

重点:必须将X-Forwarded-Host设置为外部访问域名my.company.internal,X-Forwarded-Proto设为https。

3. 更新Entra ID应用注册的重定向URI

在Entra ID应用注册的身份验证页面中,添加外部访问的完整重定向URI:https://my.company.internal/theapp/signin-oidc,可保留容器内部URI作为备用,但确保外部URI处于启用状态。

4. 显式指定重定向URI(可选兜底方案)

如果ForwardedHeaders仍未生效,可在配置中强制指定重定向地址:

  • 在appsettings.json的AzureAd节点添加:
"RedirectUri": "https://my.company.internal/theapp/signin-oidc",
"PostLogoutRedirectUri": "https://my.company.internal/theapp/signout-callback-oidc"
  • 或在代码中直接配置:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(options =>
    {
        builder.Configuration.Bind("AzureAd", options);
        options.RedirectUri = "https://my.company.internal/theapp/signin-oidc";
        options.PostLogoutRedirectUri = "https://my.company.internal/theapp/signout-callback-oidc";
    });

5. 验证Azure容器应用网络配置

确保容器应用环境允许HAProxy的流量访问,且容器应用的入口路由未篡改请求头,无额外的端口或路径映射冲突。

结论

该场景完全可以实现Entra ID认证,核心是让应用正确识别外部请求的真实URL,通过上述配置即可解决重定向错误问题。本地及Docker部署正常是因为无中间代理,应用直接获取到真实请求地址。

内容的提问来源于stack exchange,提问作者JaggenSWE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:22:40