如何在 ASP.Net Core 6.0 中实现 HSTS 标头?

Kar*_*mar 6 c# asp.net hsts asp.net-core asp.net-core-6.0

我需要在 ASP.Net Core 6.0 WEB API 应用程序中实现 HSTS 标头安全性。

下面是我的Program.cs

    var builder = WebApplication.CreateBuilder(args);
    ...
    // Https redirection
    builder.Services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = (int)HttpStatusCode.TemporaryRedirect;
        options.HttpsPort = 7075;
    });
    
    // HSTS Security Headers 
    builder.Services.AddHsts(options =>
    {
        options.Preload = true;
        options.IncludeSubDomains = true;
        options.MaxAge = TimeSpan.FromDays(365);
    });
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {
        app.UseSwagger();
        app.UseSwaggerUI();
        app.UseHsts();
    }
    
    app.UseHttpsRedirection();
    
    app.UseAuthorization();
    
    app.UseCustomExceptionHandler();
    
    app.MapControllers();
    
    app.Run();
Run Code Online (Sandbox Code Playgroud)

下面是launchSettings.json

{
  "$schema": "https://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:17240",
      "sslPort": 0
    }
  },
  "profiles": {
    "EFCoreRelationshipsTutorial": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "launchUrl": "swagger",
      "applicationUrl": "http://localhost:5075;https://localhost:7075",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

该应用程序在 URL - http://localhost:5075/swagger/index.html 上启动,但是,我希望它会自动重定向到 https://localhost:7075/swagger/index.html。

另外,我期待响应中的严格传输安全标头,例如

在此输入图像描述

但是,它不存在于响应标头中。

在此输入图像描述

我缺少什么?如何在asp.net core 6.0中实现HSTS?

Met*_*urf 16

.AddHsts()排除localhost这就是为什么你看不到它在你的开发机器上运行的原因;以及为什么只建议在生产中使用它。

来自 asp.net 文档HTTP 严格传输安全协议 (HSTS)

在开发中不建议使用 UseHsts,因为 HSTS 设置可以被浏览器高度缓存。默认情况下,UseHsts 不包括本地环回地址。

对于首次实现 HTTPS 的生产环境,请使用 TimeSpan 方法之一将初始 HstsOptions.MaxAge 设置为较小的值。将值从几小时设置为不超过一天,以防您需要将 HTTPS 基础设施恢复为 HTTP。当您对 HTTPS 配置的可持续性充满信心后,请增加 HSTS max-age 值;常用的值为一年。

然后是一段代码:

using System.Net;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.AddHsts(options =>
{
    options.Preload = true;
    options.IncludeSubDomains = true;
    options.MaxAge = TimeSpan.FromDays(60);
    options.ExcludedHosts.Add("example.com");
    options.ExcludedHosts.Add("www.example.com");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = (int)HttpStatusCode.TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

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

本文的其余部分更详细地解释了配置选项和行为。

编辑:本地测试 UseHsts

只是做了一些实验,Strict-Transport-Security通过在我的 Windows 主机文件中创建一个条目并更新我的launchSettings.json.

编辑你的主机文件;超级用户示例

文件:C:\Windows\System32\drivers\etc\hosts

添加一些内容:

127.0.0.1 myweb.local
Run Code Online (Sandbox Code Playgroud)

保存文件(您可能需要在管理模式下打开编辑器)。并使用您发布的设置,将主机名从本地主机修改为主机文件中定义的站点名称,即myweb.local

127.0.0.1 myweb.local
Run Code Online (Sandbox Code Playgroud)

当然,我的环境仅启用了 https,但在主机文件中创建条目并更新启动设置以使用我映射回 127.0.0.1 的主机名后,标头就出现了。