ASP.NET Core 2.1 + Kestrel如何禁用HTTPS?

121

看起来随着ASP.NET Core 2.1的推出,Kestrel现在自动创建一个HTTPS端点和HTTP端点,而默认的项目模板将被设置为从HTTP重定向到HTTPS(这很容易撤销)。

然而我的问题是......我如何完全禁用项目中的HTTPS。我已经阅读了文档并尝试了各种HTTPS配置设置,但我所做的一切似乎都无法让我关闭HTTPS并运行一个HTTP项目。

我是疯了还是漏了什么?我希望这很容易做到。

12个回答

101

在 Startup.cs 中删除中间件

app.UseHttpsRedirection();

31
这只能防止强制HTTP -> HTTPS重定向(使您可以访问未加密的网站),但它并不禁用HTTPS。 Kestrel仍在使用两个端口(通常是5000用于HTTP和5001用于HTTPS)。我要找的只是HTTP,完全没有HTTPS。 - Xorcist
3
这对我很有帮助。我之前在使用 Android 模拟器时,由于它可能不接受自签名 SSL,所以试图连接 HTTP 地址,但是一直报错 "307 临时重定向"。经过一番调查后,我认为这是因为服务器正在重定向到 HTTPS。移除了那行代码后问题得到解决。 - Damn Vegetables
即使这并没有禁用HTTPS,这仍然是非常有用的信息。我也遇到了307临时重定向问题,而这个方法解决了它。 - Ryan Lundy

74

如果您正在使用Visual Studio 2017,则可以执行以下操作:

  1. 转到项目属性。 (右键单击>属性)
  2. 单击调试选项卡。
  3. 在Web服务器设置下,取消选择“启用SSL”。
  4. 保存,构建并重新尝试。

这将更新launchSettings.json文件中的iisExpress设置。


3
不知何故,我的 VS2017 中没有该选项。所以要进行以下操作:项目属性 => 调试 => 应用程序 URL(去掉 "s")并设置适当的启动页 => 保存(弹出覆盖 launchSettings 的弹窗显示)=> 确定,然后就可以开始调试了(按 F5)。 - Nordes
我正在单独使用.NET Core CLI。我的*.csproj或appsettings.json中没有任何指示应使用SSL的内容。根据最新的文档,当存在本地开发证书时,ASP.NET会自动创建SSL端点。因此,我认为在代码中有一种方法可以禁用它,但到目前为止我找不到任何方法。 - Xorcist
3
如果不依赖Visual Studio,我认为这个答案会更好。那么launchSettings.json文件会发生什么变化? - Yehuda Makarov
这非常没有帮助。问题是关于asp core和kestrel,而你的答案是关于在Windows上的旧版dotnet。 - djeikyb
这种技术在VS-2019中也很有效。非常感谢您的解决方案,Abhishek。 - Ashok kumar

61
在你的项目文件Properties/launchSettings.json中,查找键applicationUrl。你会发现类似以下内容:
...
"applicationUrl": "https://localhost:5001;http://localhost:5000",
...

删除https端点即可完成。

编辑

如@Xorcist所指出的那样,文件launchSettings.json未发布。因此,上述解决方案仅适用于开发环境。要禁用https,并在生产和开发中通用地配置要监听的URL,您还可以执行以下操作之一:

  • 使用dotnet run --urls=http://0.0.0.0:5000,https://0.0.0.0:5001参数可以达到与launchSettings.json中的applicationUrl相同的效果。再次强调,删除不需要使用的选项。

  • 同样可以通过设置ASPNETCORE_URLS环境变量来实现。

  • 正如@Konstantin在这个问题的答案中提到的,ASP Net Core 2.1还可以在appsettings.json中配置Kestrel终结点(在2.0中似乎无法完成)。

  • 最后,也可以使用useUrls扩展方法WebHost.CreateDefaultBuilder(args).UseUrls("http://0.0.0.0:5000")达到相同的效果。我更喜欢前面的解决方案,因为这种方式会硬编码你的应用程序终结点,无法在不重新编译应用程序的情况下更改。

所有可能的选项都在Microsoft Docs on this中详细说明。

更新(2020年12月9日):根据微软文档,这些选项仍然适用于 .NET Core 3.1,除了 appsettings。也许它仍然有效,但我不确定。 更新(2021年5月19日):根据微软文档,这些选项仍然适用于 .NET 5,除了 appsettings。也许它仍然有效,但我不确定。

请注意,上述答案引用了由Visual Studio创建的启动配置文件,当使用VSCode或通过dotnet new时,该文件不会自动创建。但是只要文件存在并且引用了适当的配置文件(即dotnet run --launch-profile=ProfileNameHere),它似乎可以按照所述功能运行。请注意,如果未指定配置文件,则始终使用配置中的第一个配置文件作为默认配置文件。尽管如此,我认为launchSettings.json不能替代appsettings.json,因为它不会被发布。 - Xorcist
实际上,在dotnet 2.1中,“dotnet new”会自动创建一个“launchSettings.json”文件。这在dotnet 2.0中并不是这样的。我刚在我的Ubuntu系统上进行了测试,其中没有安装Visual Studio。因此,至少对于2.1版本,“launchSettings.json”不是特定于Visual Studio的文件。 - joanlofe
关于 launchSettings.json 不被发布的事实,这也是正确的,但在生产环境中,您可能希望默认启用 https。无论如何,我将更新我的答案并提供其他选项。 - joanlofe
是的,看起来我完全忽略了2.1现在在他们的Web模板中包括launchsettings.json这一事实。对于造成的混淆,我感到非常抱歉,因为我们在我的工作中使用一些自定义模板,显然还没有完全更新到2.1。至于使用2.1进行生产,我们目前在appsettings.Production.json中使用“Kestrel”端点部分来配置HTTPS(并从appsettings.json和/或appsettings.Development.json中排除这些端点)。但我的初始问题主要针对开发培训,我希望从HTTP开始,稍后再具体配置HTTPS。 - Xorcist
1
非常感谢,但是appsettings没有问题,正如您在链接的文档中所描述的那样--这是他们描述的第一件事情:-)。我刚刚测试了它(Net 5)。 - astrowalker

46

结果发现我想要做的正确方法是使用.UseKestrel()来具体配置Kestrel,并且简单地指定一个地址,就像这样:

  WebHost.CreateDefaultBuilder(args)
    .UseKestrel(options => {
      if (context.Configuration[WebHostDefaults.EnvironmentKey] == Environments.Development) {
        options.Listen(IPAddress.Loopback, 5080); //HTTP port
      }
    })
    .UseStartup<Startup>();

实际上是覆盖了默认设置,当 Kestel 开始时会显示此警告:

warn: Microsoft.AspNetCore.Server.Kestrel[0]
  Overriding address(es) 'https://localhost:5001, http://localhost:5000'. Binding to endpoints defined in UseKestrel() instead.

请注意检查开发环境;在生产环境中,端口默认为不同的端口(80),且没有HTTPS。

如果指定了第二个地址,则假定该地址将受到内置开发人员证书的保护,因此:

  WebHost.CreateDefaultBuilder(args)
    .UseKestrel(options => {
      options.Listen(IPAddress.Loopback, 5080); //HTTP port
      options.Listen(IPAddress.Loopback, 5443); //HTTPS port
    })
    .UseStartup<Startup>();

您当然可以按照此处描述的方法,专门保护您的SSL地址:

https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1&tabs=aspnetcore2x

这对于生产设置是必要的。


3
使用.UseUrls()或.UseConfiguration()与JSON配置中指定的"urls"属性,可以进一步简化此过程。当只提供单个地址时,两者的功能相同。 - Xorcist
我被要求为我的上面的评论添加一个示例,所以在这里:hosting.json{ "urls": "http://localhost:5080" }program.cs (main)public static void Main(string[] args) { IConfigurationRoot config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("hosting.json") .AddCommandLine(args) .Build(); CreateWebHostBuilder(args).UseConfiguration(config).Build().Run(); } - Xorcist
有没有办法移除 Kestrel? - sina_Islam
6
“移除Kestrel”毫无意义,因为Kestrel就是HTTP服务器。如果没有它,你将没有Web应用程序。 - McGuireV10

18
在 Program.cs 中,按以下方式添加 UseUrls:
WebHost.CreateDefaultBuilder(args)
.UseUrls("http://localhost:5000")
.UseStartup<Startup>();

在Startup.cs中删除/注释以下内容:

app.UseHttpsRedirection();

在startup.cs中简单地注释掉了“app.UseHttpsRedirection();”,就停止了重定向到https,并开始在http上产生结果。 - Blaze

16

dotnet CLI现在有一个针对此的模板。

dotnet new webapi --no-https

这是我在使用 .net core 3.1 和 CLI 时唯一有效的方法。 - Andrew Cowenhoven

7

关闭https 只需要进行以下三个更改...

Properties/launchSettings.json

  • sslPort 设置为 0
  • applicationUrl 中删除 https 的网址

Properties/launchSettings.json

Startup.cs

  • 删除或注释掉 app.UseHttpsRedirection()

Startup.cs


1
对我不起作用(使用VS for Mac的.Net 5.0)。我的整个解决方案中没有任何关于https、ssl或端口5001的引用,但在本地调试时浏览器却打开了https://....:5001。 - Ash
@Ash在.NET5上对我来说很好用 - 我使用Visual Studio Code在Windows上(尽管操作系统在这里并不重要)。我怀疑Mac上的VS有所不同。 - PandaWood

5

使用 ASP.NET CORE 2.2,只需将 Web 服务器 URL 设置为 http 而不是 https,它会自动识别。您可以将其作为自托管进程运行。

  1. 进入项目属性。
  2. 点击调试选项卡。
  3. 在 Web 服务器设置下,将 URL 设置为http://xxx
  4. 尝试再次运行 :)

那是唯一适合我的选择:)。谢谢。 - Ribaz

2

仅用于开发而非生产环境: 在此输入图片描述

在项目属性中禁用启用 SSL。


1

如果使用Docker,禁用https的另一种方法是非常方便的。在Dockerfile中设置环境变量,将其值设置为仅含一个HTTP网址。

#https + http
ENV ASPNETCORE_URLS=http://+:5001;http://+:5000 

#http only
ENV ASPNETCORE_URLS=http://+:5000 

这个应该写在Dockerfile的哪个部分? - undefined

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