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

强制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:09:03