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

NGINX HTTPS代理与Azure AD重定向URI兼容问题求助

解决方案:Blazor Server + NGINX反向代理下Azure AD登录HTTP重定向URI问题

核心原因

你的.NET应用未正确信任NGINX传递的X-Forwarded-Proto头,导致应用仍认为自身运行在HTTP环境中,生成的Azure AD重定向URI使用HTTP协议,与Azure AD应用注册中配置的HTTPS URI不匹配,触发AADSTS50011错误。

步骤1:修正Program.cs中的ForwardedHeaders配置

必须在添加认证服务之前配置转发头,并明确信任你的NGINX代理IP,同时确保UseForwardedHeaders在认证中间件之前执行:

var builder = WebApplication.CreateBuilder(args);

// 配置ForwardedHeaders,必须在AddAuthentication之前
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    // 添加NGINX服务器的IP到信任列表(替换为你的NGINX实际IP)
    options.KnownProxies.Add(IPAddress.Parse("192.168.1.xxx"));
    // 如果NGINX在Docker子网内,可添加子网信任(比如Docker默认子网172.17.0.0/16)
    // options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("172.17.0.0"), 16));
});

// 添加Azure AD认证服务
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));

builder.Services.AddControllersWithViews()
    .AddMicrosoftIdentityUI();

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

var app = builder.Build();

// 必须在UseAuthentication/UseAuthorization之前调用UseForwardedHeaders
app.UseForwardedHeaders();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

// 注释或移除UseHttpsRedirection,因为NGINX已强制HTTPS
// app.UseHttpsRedirection();

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

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

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

app.Run();

步骤2:完善NGINX配置(确保SignalR与转发头正常工作)

在NGINX的http块中添加$connection_upgrade的映射配置(之前的配置可能缺少这个,导致SignalR连接异常):

http {
    # 其他原有配置...
    
    # 配置WebSocket升级映射
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    # 你的HTTPS server配置
    server {
        listen 443 ssl;
        server_name www.example.com;
        ssl_certificate     /https/tags/server.crt;
        ssl_certificate_key /https/tags/server.key;

        location / {
            proxy_pass http://192.168.1.11:8081;

            # WebSocket配置
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_cache off;
            proxy_http_version 1.1;

            proxy_read_timeout 100s;

            # 转发头配置(已存在,确认保留)
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

    # HTTP重定向到HTTPS的配置(已存在,确认保留)
    server {
        listen 80 default_server;
        server_name _;
        return 301 https://$host$request_uri;
    }
}

步骤3:验证Azure AD应用注册配置

确保Azure AD应用注册中已添加https://www.example.com/signin-oidc作为重定向URI,且已移除或禁用HTTP协议的重定向URI条目。

步骤4:Docker容器补充配置(可选)

在Docker启动命令或docker-compose.yml中添加环境变量,明确启用转发头支持:

# Docker run命令示例
docker run -e ASPNETCORE_FORWARDEDHEADERS_ENABLED=true -p 192.168.1.11:8081:80 your-blazor-image

关键注意事项

  • UseForwardedHeaders必须在UseAuthentication、UseAuthorization、UseHttpsRedirection之前执行,否则认证中间件会在获取转发头前生成HTTP重定向URI。
  • 必须显式添加NGINX的IP到KnownProxies,.NET默认会忽略未信任代理发送的转发头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:57:46