为 Asp.net core web api 启用 HTTPS 安全连接

nia*_*iao 7 https asp.net-core-2.1

我有使用 ASP.NET Core 2.1 创建的 REST API 应用程序。REST API 由 WebHostBuilder 创建并由 Kestrel 托管。

Startup.Kernel = kernel;
    _restApiServer = new WebHostBuilder()
      .UseKestrel(options =>
      {

      })
      .UseContentRoot(Directory.GetCurrentDirectory())
      .UseIISIntegration()
      .UseStartup<Startup>()
      .UseUrls(string.Format("http://localhost:{0}", _configuration.PortNumber))
      .UseSetting("https_port",_configuration.HttpsPort.ToString())
      .Build();
     _restApiServer.Run();
Run Code Online (Sandbox Code Playgroud)

默认情况下,REST API 在端口 8998 上提供服务。这个 REST API 是由我的不同应用程序启动的。我可以使用浏览器和 POSTMAN 连接到这个 REST API。

现在我想保护我与 REST API 的连接。我所做的是:我在 Configure 方法的 Startup 类中添加了必要配置以强制安全连接:

app.UseHttpsRedirection();
Run Code Online (Sandbox Code Playgroud)

而且我还执行了一个用于信任开发证书的代码:

dotnet dev-certs https --trust
Run Code Online (Sandbox Code Playgroud)

情况是,当我尝试通过浏览器访问 web api 时,出现错误:

本地主机拒绝连接。尝试:

检查连接

检查代理和防火墙

ERR_CONNECTION_REFUSED

此外,当我使用 POSTMAN 调用一些 REST API 方法时,我得到并出错:

无法得到任何回应

我究竟做错了什么?我需要在 Kestrel 配置中直接指定证书吗?

Rua*_*urg 6

由于 https 是不同的协议,因此您需要为 https 配置另一个端口。为了自动重定向到 https url,您需要做三件事:

  1. 添加监听器。在 program.cs 中(端口号是一个例子):

    .UseUrls("http://localhost:8998", "https://localhost:8999");

    当您启动应用程序时,您应该看到:

在此处输入图片说明

  1. 配置 https 重定向。在 Startup.ConfigureServices 中:

    services.AddHttpsRedirection(options => options.HttpsPort = 8999);

    如果省略此步骤,则使用默认端口,可能是 5001。对于在 Azure 上托管,您可能需要将其设置为 443。

  2. 在 Startup.Configure 中:

    app.UseHttpsRedirection();

对 的调用http://localhost:8998现在将被重定向到https://localhost:8999


如果您按照上述步骤操作但未创建证书,则不会列出 https 端口并且将不可用!如果创建了证书,则应列出两个端口。

我假设在生产中 Api 将在代理后面运行。在这种情况下,您可以省略上述步骤。在代理后面运行意味着您可以将 http 重定向到 https 那里,这意味着您不需要https redirect

  • 微软明确表示不要这样做。重定向对于 api 来说没有任何意义,因为 api 客户端不理解重定向。在此处查看更多信息:https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl?view=aspnetcore-3.1&amp;tabs=visual-studio (2认同)