强制ASP.NET Core 2.1使用HTTPS并返回40x错误配置失效问题
核心根因
Azure App Service 采用反向代理架构转发请求,应用实例实际收到的请求都是代理发起的HTTP请求,ASP.NET Core默认无法识别原始客户端的请求协议,导致HTTPS重定向逻辑不生效。如果HTTP请求能直接到达应用层,说明Azure的HTTPS Only规则也没有正常触发。
修复方案
1. 配置转发头识别中间件(必需配置)
Azure反向代理会将原始请求协议通过X-Forwarded-Proto头传递给应用,需要先配置中间件让ASP.NET Core正确读取原始请求信息:
在ConfigureServices中添加配置:
services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 清除代理IP限制,适配Azure动态代理节点 options.KnownProxies.Clear(); options.KnownNetworks.Clear(); });
在Configure方法最开头添加中间件:
必须放在现有所有中间件之前,优先级最高:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // 第一行就添加该中间件 app.UseForwardedHeaders(); // 原有OPTIONS拦截中间件写在该位置 app.Use(async (context, next) => { if (context.Request.Method == "OPTIONS") { context.Response.StatusCode = 405; return; } await next.Invoke(); }); // 剩余原有逻辑保持不变 }
配置完成后UseHttpsRedirection就能正确识别原始HTTP请求,触发重定向逻辑。
2. 直接返回40x错误的可选方案
如果不需要301重定向,要求HTTP请求直接返回40x错误,可以添加自定义中间件实现,放在UseForwardedHeaders之后即可:
app.Use(async (context, next) => { if (!string.Equals(context.Request.Scheme, "https", StringComparison.OrdinalIgnoreCase)) { // 可以根据需求返回403禁止访问/426需要升级协议 context.Response.StatusCode = StatusCodes.Status403Forbidden; return; } await next(); });
3. Azure层面配置排查
正常开启Azure的「HTTPS Only」开关后,HTTP请求会在Azure接入层直接被重定向,不会到达应用实例,HTTP请求能到达应用需要排查以下点:
- 确认开启HTTPS Only的是当前访问的部署槽,不是其他测试槽
- 检查应用前端是否有CDN、WAF等其他接入层,确认接入层没有把HTTP请求转成HTTPS回源,或者绕过了Azure的HTTPS Only规则
- 测试时清除本地DNS缓存、浏览器缓存,避免旧的规则缓存影响测试结果
内容的提问来源于stack exchange,提问作者KVN
相关产品推荐
相关产品推荐

