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

How do I disable HTTPS in ASP.NET Core 2.1 + Kestrel?

随着 ASP.NET Core 2.1 的出现,Kestrel 现在会自动创建一个 HTTPS 端点和 HTTP 端点,并且默认项目模板设置为从 HTTP 重定向到 HTTPS(这很容易撤消)。

但是我的问题是...如何为我的项目完全禁用 HTTPS。我已经通读了文档并尝试了 HTTPS 的各种配置设置,但我似乎无法关闭它,只是 运行 一个 HTTP 项目。

我是疯了还是错过了什么。我希望这会非常容易做到。

如果您使用的是 Visual Studio 2017,那么您可以执行以下操作:

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

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

在Startup.cs中去掉中间件

app.UseHttpsRedirection();

原来实现我想要做的事情的正确方法是使用 .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://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1&tabs=aspnetcore2x

这是生产设置所必需的。

在您项目的文件 Properties/launchSettings.json 中,查找密钥 applicationUrl。你会发现类似:

...
"applicationUrl": "https://localhost:5001;http://localhost:5000",
...

删除 https 端点即可完成。

编辑

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

  • 使用dotnet run--urls参数,效果与launchSettings.json中的applicationUrl相同。例如:dotnet run --urls=http://0.0.0.0:5000,https://0.0.0.0:5001。再次,删除您不想使用的那个。

  • 同样可以通过 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 日):这些选项是 still valid for Net Core 3.1, as per Microsoft Docs,应用设置除外。也许它仍然有效,但我不确定。

更新(2021 年 5 月 19 日):这些选项是 still valid for Net 5, as per Microsoft Docs,应用设置除外。也许它仍然有效,但我不确定。

在 Program.cs 中,添加 UseUrls 如下:

WebHost.CreateDefaultBuilder(args)
.UseUrls("http://localhost:5000")
.UseStartup<Startup>();

并且在 Startup.cs remove/comment 中:

app.UseHttpsRedirection();

dotnet CLI 现在有一个模板。

dotnet new webapi --no-https

使用 ASPNET CORE 2.2,我只需将 Web 服务器 URL 设置为 http 而不是 https,它会自行选择。我 运行 它是一个自托管进程。

  1. 转到您的项目属性。
  2. 单击“调试”选项卡。
  3. 在 Web 服务器设置下,将 URL 设置为 http://xxx
  4. 再试一次:)

用于开发而非生产:

在项目属性中禁用启用 SSL

关闭https就在于这3个变化...

Properties/launchSettings.json

  • sslPort 设置为 0
  • applicationUrl
  • 中删除 https url

Startup.cs

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

另一种禁用 https 的方法在使用 docker 时非常方便。 在 Dockerfile 中设置环境变量,只有一个 HTTP url in value.

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

@joanlofe 的回答非常好,但也有一种“愚蠢”的方式可以在 5001 端口上重新引入 HTTPS。如果您在配置源上调用 Clear(例如,为了配置源的适当分层),这意味着一个隐式源消失了——“launchSettings.json”模板。因此,如果您依赖此文件而不是“appsettings.json”(默认情况下您可能是),您的应用程序将在端口 5001.

上启用 HTTPS