Asp.net core 2.1 在 IIS 上使用 UseHttpsRedirection 不起作用

11

我将我的asp.net core 2.1 WebApi部署到了IIS 10。(IIS充当了代理)

我在IIS中添加了SSL证书并为不安全端口(8081)和安全端口(8082)添加了绑定。

但是,当我访问http://localhost:8081/api/values时,浏览器只会返回403 Forbidden,而不是将我重定向到https://localhost:8082/api/values

我的启动代码如下:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
           .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        services.AddHttpsRedirection(options=>
        {
            options.HttpsPort = 8082;
        });
    }


    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        //app.UseForwardedHeaders();
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseMvc();
    }
4个回答

17
我发现的问题是,从.net core 2.0 到 .net core 2.1 的变化意味着在 startup.cs 中需要明确指定 https 端口。
services.AddHttpsRedirection(options =>
    {
        options.HttpsPort = 443;
    });

更多信息请参见:https://github.com/aspnet/AspNetCore/issues/3176


嗨,我有这个问题,我把端口改成了443,但它并没有解决问题。请问你还有其他的替代方案吗? - Damien Doumer

7
在我的情况下,错误在于按不支持的顺序调用内容。通过重新排列我的代码,首先调用:
app.UserHttpsRedirection()

然后调用

app.UseHsts()

它开始运行而不是相反。


这个可以工作,但是很奇怪,因为文档显示的顺序是错误的。 - prinkpan

2
在我的startup.cs文件中,我进行了以下设置。
public void ConfigureServices(IServiceCollection services)
{
    try
    {
        //..other codes

        services.AddHttpsRedirection(options =>
        {
            options.HttpsPort = 443;
        });
    }
    catch (Exception ex)
    {
        string innerMessage = "";
        if (ex.InnerException != null)
            innerMessage = ex.InnerException.Message;

        Log.Logger.Error("ConfigureServices Message: " + ex.Message + " inner Message:" + innerMessage + "Env.Name:" + _env.EnvironmentName);
    }
}

在 Configure 方法中,我使用了以下代码:
        app.UseHttpsRedirection();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

1
你收到了这个状态码是因为在SSL设置中选择了Require SSL。

IIS - SSL Settings

IIS - SSL Settings

如果您想使用代码进行重定向以使用未经检查的https,请取消选中此选项。但首先,您应该仔细阅读文档:在ASP.NET Core中强制执行HTTPS
请勿在接收敏感信息的Web API上使用RequireHttpsAttribute。 RequireHttpsAttribute使用HTTP状态代码将浏览器从HTTP重定向到HTTPS。 API客户端可能不理解或遵守从HTTP到HTTPS的重定向。这样的客户端可能会通过HTTP发送信息。 Web API应该要么:不监听HTTP,要么关闭具有状态码400(错误请求)的连接并不提供服务请求。

这对我来说是解决方案。 - Jay
谢谢!我浪费了60分钟的时间。 - danmc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接