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

Azure AD /signin-oidc 404:Nginx反向代理下的.NET Core 2.0应用问题

解决反向代理下OpenID Connect /signin-oidc 404的问题

你已经搞定了协议跳转的问题,但认证回调的404是反向代理场景里的常见配置坑,我来帮你一步步排查修复:

1. 简化ForwardedHeaders配置,移除自定义Scheme设置

你手动写的context.Request.Scheme = "https"其实没必要,甚至可能和ForwardedHeaders中间件冲突。.NET Core的ForwardedHeaders本来就是用来处理反向代理传递的X-Forwarded-Proto头的,只要配置正确,它会自动修正请求的Scheme。

修改你的配置:

// 注意:这个中间件要放在所有其他中间件最前面
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
    // 关键:添加你的域名到允许列表,.NET Core 2.0默认不会信任任何反向代理主机
    AllowedHosts = { "my.domain.cloudapp.azure.com" }
});

// 把这段自定义中间件删掉
// app.Use(async (context, next) => { ... });

2. 检查Nginx是否正确传递转发头

你的Nginx必须把客户端的真实协议、IP和主机信息传递给后端应用,否则ForwardedHeaders无法工作。确保Nginx的location块里有这些配置:

location / {
    proxy_pass http://your-app-container:port;
    # 传递真实客户端IP
    proxy_set_header X-Forwarded-For $remote_addr;
    # 传递客户端使用的协议(https)
    proxy_set_header X-Forwarded-Proto $scheme;
    # 传递原始请求的主机头
    proxy_set_header Host $host;
}

如果Nginx本身运行在容器里,还要确认这些头没有被其他配置规则过滤掉。

3. 严格遵守中间件顺序

UseForwardedHeaders必须放在所有其他中间件之前,尤其是UseAuthentication和UseMvc。正确的顺序应该是这样:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    // 第一步:处理反向代理转发头
    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
        AllowedHosts = { "my.domain.cloudapp.azure.com" }
    });

    // 第二步:加载认证中间件
    app.UseAuthentication();

    // 第三步:静态文件、MVC等其他中间件
    app.UseStaticFiles();
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

顺序错了的话,认证中间件会使用未修正的请求上下文,导致无法识别回调路径。

4. 再次确认Azure AD的回复URL配置

虽然你已经解决了Scheme切换问题,但还是要再核对Azure AD应用注册里的回复URL是否完全匹配https://my.domain.cloudapp.azure.com/signin-oidc,大小写、路径都不能有偏差。

5. 显式指定OpenID Connect的回调路径

在Startup.ConfigureServices里,最好显式指定回调路径,避免默认配置的潜在问题:

services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    // 其他配置(租户ID、客户端ID等)...
    options.CallbackPath = "/signin-oidc"; // 默认值,但显式写更稳妥
    options.RequireHttpsMetadata = true; // 强制使用HTTPS,符合生产环境要求
});

按照这些步骤调整后,应该就能解决回调404的问题了。本质上是反向代理的转发头没有被正确处理,导致认证中间件无法识别回调请求的正确上下文。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:04:13