Azure AD /signin-oidc 404:Nginx反向代理下的.NET Core 2.0应用问题
你已经搞定了协议跳转的问题,但认证回调的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

