无法使用HTTP开发,总是重定向到HTTPS

时间:2018-10-20 11:01:04

标签: c# https asp.net-core-mvc

我正在用HTTPS配置测试我的ASP.NET CORE MVC webapp。为此,我安装了startup.ConfiguraServices:

services.AddHttpsRedirection(options =>
        {
            options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect;
            options.HttpsPort = 443;
        });

启动时配置:

app.UseHttpsRedirection();

并按以下方式配置Kestrel服务器:

public static void ConfigureKestrelServerOptions(this KestrelServerOptions options)
    {
        var configurationService = options.ApplicationServices.GetRequiredService<IConfiguration>();
        var environmentService = options.ApplicationServices.GetRequiredService<IHostingEnvironment>();

        var endpoints = configurationService.GetSection("HttpServer:Endpoints")
            .GetChildren()
            .ToDictionary(section => section.Key, section =>
            {
                var endpoint = new EndPointSettings();
                section.Bind(endpoint);
                return endpoint;
            });

        foreach (var endpoint in endpoints)
        {
            var config = endpoint.Value;
            var port = config.Port ?? (config.Scheme == "https" ? 443 : 8080);

            var ipAddresses = new List<IPAddress>();
            if (config.Host == "localhost")
            {
                ipAddresses.Add(IPAddress.IPv6Loopback);
                ipAddresses.Add(IPAddress.Loopback);
            }
            else if (IPAddress.TryParse(config.Host, out var address))
            {
                ipAddresses.Add(address);
            }
            else
            {
                ipAddresses.Add(IPAddress.IPv6Any);
            }

            foreach (var address in ipAddresses)
            {
                options.Listen(address, port,
                    listenOptions =>
                    {
                        if (config.Scheme == "https")
                        {
                            var certificate = LoadCertificate(config, environmentService);
                            listenOptions.UseHttps(certificate);
                        }
                    });
            }
        }
    }

WebHost.CreateDefaultBuilder(args)
.UseKestrel(options => options.ConfigureKestrelServerOptions())

之后,我在Chrome上添加了X509证书,并且所有https都工作正常。

问题在于,现在,我想使用http协议进行调试,为此,我认为注释以上所有行均应足够,但是每次我尝试访问URL http :// localhost:8080“ 重定向到 https :// localhost / Account / LogIn?ReturnUrl =%2F“ 。< / p>

我尝试删除Chrome的localhost和localhost:8080的HSTS;我试图在其他端口执行服务器而没有运气。

有帮助吗?谢谢。

1 个答案:

答案 0 :(得分:0)

在此配置中,您强制所有HTTP请求都在HTTPS上重定向。如果您希望能够同时使用这两种配置,那么使用该配置就足够了(在开发方法上就足够了):

WebHost.CreateDefaultBuilder(args)
                .UseKestrel(options =>
                {
                    options.Listen(IPAddress.Loopback, 5000); 
                    options.Listen(IPAddress.Loopback, 5001, listenOptions => { listenOptions.UseHttps(); });
                })
                .UseStartup<Startup>();

如果运行此配置,则显然可以访问两个端点。

地址http://localhost:5000能够侦听所有HTTP请求。
地址https://localhost:5001能够侦听所有HTTPS请求。

但是,它需要在没有反向代理Kestrel的情况下运行IIS,因为它会覆盖当前配置中的设置端点。如果在Visual Studio中运行程序,则应在Web应用程序的 Profile 名称上设置处于调试模式的WebApplication属性,而启动的类型应为Project。 / p>

为什么即使使用上面的注释行也不能运行HTTP,这可能是事实,即HSTS是高度可实现的(根据Microsoft文档)。我会怀疑浏览器在缓存中的某处保存了一些有关客户端和服务器之间的通信应如何工作的信息。因此即使配置被取消,它也可能导致重定向。