四、敏感数据暴露

传输中和静止时的数据保护至关重要。确保使用强大的传输协议和 web 安全指令可以防止数据在传输过程中受到破坏,并防止意外的敏感数据泄露。在代码中使用最新的传输层安全TLS协议版本)有助于缓解 TLS 较低版本的实现缺陷带来的这些漏洞,使中间人攻击贵宾犬LogJam怪胎很难成功。

本章将帮助您确定代码中是否存在充分保护传输中和静止数据的安全要求。您还将了解可以在 ASP.NET Core web 应用中实现哪些其他 web 安全机制来保护您免受不必要的数据泄漏。

在本章中,我们将介绍以下配方:

  • 修复传输中数据保护不足的问题
  • 修复丢失的HTTP 严格传输安全HSTS】
  • 修复弱协议
  • 修复硬编码加密密钥
  • 禁用关键网页的缓存

这些方法将教您如何在 ASP.NET Core web 应用中实现 HTTPS、启用 HST、确保应用了最新版本的 TLS,以及如何保护加密密钥。本章还将讨论发送缓存控制指令以禁用包含敏感数据的页面上的缓存。

技术要求

这本书是为配合 VisualStudio 代码、Git 和.NET5.0 而编写和设计的。ASP.NET Core Razor 页面中提供了配方中的代码示例。本书配方中的代码示例主要在 ASP.NET Core Razor 页面中介绍。示例解决方案还使用 SQLite 作为数据库引擎,以简化设置。本章的完整代码示例可在上找到 https://github.com/PacktPublishing/ASP.NET-Core-Secure-Coding-Cookbook/tree/main/Chapter04

修复传输中数据保护不足

TLS 是一种网络通信协议,用于在 web 上保护数据并通过加密实现隐私。当浏览器和 web 服务器之间传输的敏感数据未加密或可能被截获时,此安全协议的缺失或有缺陷的实现会给 ASP.NET web 应用带来巨大的风险。启用 TLS 是充分加密传输中数据的第一步。本章中的后续配方将提供更多保护。

不在 ASP.NET Core web 应用中启用 TLS 会使客户端和服务器之间传输的机密数据面临风险。您必须确保HTTPS已配置为最佳保护。

在本教程中,我们将学习如何正确降低缺少安全协议实现和 HTTPS 支持的风险。

准备好了吗

为了完成本章中的食谱,我们需要一个在线银行应用示例。

打开命令 shell 并通过克隆 ASP.NET Secure Codeing Cookbook 存储库下载示例网上银行应用,如下所示:

git clone https://github.com/PacktPublishing/ASP.NET-Core-Secure-Coding-Cookbook.git

运行示例应用以验证没有生成或编译错误。在命令 shell 中,导航到位于\Chapter04\insufficient-transport-protection\before\OnlineBankingApp的示例应用文件夹,并运行以下命令:

dotnet build

dotnet build命令将构建示例OnlineBankingApp项目及其依赖项。

怎么做…

让我们来看看这个配方的步骤:

  1. 在“开始练习”文件夹中,通过键入以下命令来启动 Visual Studio 代码:

    cs code .

  2. Open the Startup.cs class file and add the following code before the closing braces of the ConfigureServices method:

    cs if (Environment.IsDevelopment()) {     services.AddHttpsRedirection(options =>     {         options.RedirectStatusCode =            StatusCodes.Status307TemporaryRedirect;         options.HttpsPort = 5001;     }); } else {     services.AddHttpsRedirection(options =>     {         options.RedirectStatusCode =            StatusCodes.Status308PermanentRedirect;         options.HttpsPort = 443;     }); }

    我们添加了一个条件语句,用于检查当前环境是否正在开发或生产中运行。此检查将帮助我们确定是否必须使用标准 HTTPS 端口443执行临时重定向或永久重定向。

  3. Configure方法

    cs app.UseHttpsRedirection();

    中对UseStaticFiles的调用之前添加对UseHttpsRedirection方法的调用 4. Open the launchsettings.json file and change the values in applicationUrl and environmentVariables, as shown in the following highlighted code:

    cs "OnlineBankingApp": {   "commandName": "Project",   "dotnetRunMessages": "true",   "launchBrowser": true,   "applicationUrl": "https://localhost:5001",   "environmentVariables": {     "ASPNETCORE_ENVIRONMENT": "Development",     "ASPNETCORE_URLS":        "http://localhost:5000;https://localhost:5001   }

    launchsettings.json文件是一个配置文件,允许您在开发过程中在多个环境中工作。部署到生产环境时不包括此文件。如果您有IISExpress的设置,您可能还需要更改ASPNETCORE_URLS环境变量和applicationURL

  4. 在菜单中导航至终端新终端或在 Visual Studio 代码中按Ctrl+Shift+即可。 ** 在终端中键入以下命令以构建并运行示例应用:

    cs dotnet run

    • 打开浏览器,进入http://localhost:5000:*

*Figure 4.1 – HTTPS enabled

图 4.1–启用 HTTPS

请注意,样本溶液被重定向到https://localhost:5001

笔记

Web API 超出了本书的范围,但需要注意的是,必须在 API 中禁用 HTTP 重定向。Web API 还应拒绝 HTTP中的请求,并返回HTTP 400状态码

它是如何工作的…

Startup类中,我们调用AddHttpsRedirection方法向服务集合注册UseHttpsRedirection。我们通过设置两个属性来配置中间件选项:RedirectStatusCodeHttpsPort。默认情况下,RedirectStatusCodeStatus307TemporaryRedirect,但在生产环境中应更改为Status308PermanentRedirect,以防止用户代理(也称为浏览器)将 HTTP 方法从POST更改为GET。我们还必须指定443的 HTTPS 标准端口:

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

提示

AddHttpsRedirection的调用是可选的,除非您需要不同的重定向状态代码或 443 以外的其他端口。

为了将 HTTP 请求重定向到 HTTPS,我们必须在Configure中添加 HTTPS 中间件,并调用UseHttpsRedirection方法。

笔记

安全套接字层又称 SSL,是 TLS 的前身。其他参考文献将 SSL 和 TLS 描述为一体,但本书中使用了 TLS 来建议最新版本的加密协议。

然而,TLS 支持种类繁多的密码套件,并且并非所有密码套件都是相同的。有些密码提供了更好的安全性,例如GCM 密码,这是理想的选择。有关密码的更多信息,请参阅 OWASP:TLS 密码字符串备忘单https://cheatsheetseries.owasp.org/cheatsheets/TLS_Cipher_String_Cheat_Sheet.html

修复缺失的 HSTS 头

HTTP 严格传输安全HSTS是另一种帮助防止中间人攻击的 web 应用安全机制。它允许 web 服务器发送一个特殊的 HTTP 响应头,通知支持浏览器后续的通信和数据传输只能通过 HTTPS 完成;否则,将不允许后续连接。

未能选择加入 HSTS 作为附加安全策略并不能消除敏感数据拦截的威胁。用 HST 补充 HTTPS 将阻止用户暴露于未加密通道的风险。

这个方法将教会我们如何启用示例 ASP.NET Core web 应用中缺失的 HST,以强制客户端完全通过 HTTPS 进行通信。

准备好了吗

我们将使用上一个配方中使用的在线银行应用。使用 Visual Studio 代码,打开位于\Chapter04\missing-hsts\before\OnlineBankingApp\的示例网上银行应用文件夹。

您可以执行此文件夹中的步骤来修复丢失的 HSTS 标头。

怎么做…

让我们来看看这个食谱的步骤:

  1. 在起始练习文件夹中,通过键入以下命令启动 Visual Studio 代码:

    cs code .

  2. Open the Startup.cs class file and add the following code before the AddHttpsRedirection call of the ConfigureServices method:

    cs     services.AddHsts(options =>     { options.ExcludedHosts.Clear();         options.Preload = true;         options.IncludeSubDomains = true;         options.MaxAge = TimeSpan.FromDays(60);     }); if (Environment.IsDevelopment()) {     services.AddHttpsRedirection(options =>     {         options.RedirectStatusCode =            StatusCodes.Status307TemporaryRedirect;         options.HttpsPort = 5001;     }); } else {     services.AddHttpsRedirection(options =>     {         options.RedirectStatusCode =             StatusCodes.Status308PermanentRedirect;         options.HttpsPort = 443;     }); }

    提示

    调用ExcludedHostsPropertyClear方法用于在本地和开发中测试 HST。此方法阻止localhost被排除,因为它是环回主机。此代码必须在生产环境中删除

    您还可以为本地主机和/或开发环境主机添加排除选项作为替代:

    options.ExcludedHosts.Add("localhost");

    当 HST 设置不正确时,在本地测试 HST 可能会导致一些意外错误。遇到错误时,必须清除 HSTS 缓存。

  3. 添加对UseHsts方法

    cs if (webHostEnv.IsDevelopment()) {     appBuilder.UseDeveloperExceptionPage(); } else {     appBuilder.UseExceptionHandler("/Error");     appBuilder.UseHsts(); }

    的调用 4. 为了使IsDevelopment方法返回false并使我们能够在本地测试 HST,我们需要临时更改环境变量。打开`Chapter04\missing-hsts\before\OnlineBankingApp\Properties\launchSettings.json并找到ASPNETCORE_ENVIRONMENT节点。将数值从Development更改为Staging`:

    cs     "environmentVariables": {     "ASPNETCORE_ENVIRONMENT": "Staging",     "ASPNETCORE_URLS":        "http://localhost:5000;https://localhost:5001"     }

  4. 导航到菜单中的终端新终端或在 Visual Studio 代码中按Ctrl+Shift+即可。 ** 在终端中键入以下命令以构建并运行示例应用:

    cs dotnet run

    • F12打开浏览器的开发者工具。 进入网络选项卡,监控即将到来的流量。 Open a browser and go to http://localhost:5000.

    您的浏览器将自动将您重定向到https://localhost:5001

    • 在开发者工具窗格的网络选项卡中,选择已发送到本地主机的第二组 HTTP 流量,并检查 HTTP 响应头:*

*Figure 4.2 – Strict-Transport-Security HTTP header

图 4.2–严格传输安全 HTTP 头

响应中包含一个新的 HTTP 头。严格传输安全 HTTP 头在 ASP.NET Core web 应用中启用 HST。

它是如何工作的…

要在我们的 ASP.NET Core web 应用中启用 HSTS,我们需要通过调用AddHsts来添加 HSTS 服务。此处配置了 HSTS 服务的以下属性:

  • Preload:发送预加载标志作为严格传输头的一部分。它指示支持浏览器将 ASP.NET Core web 应用的域包含在预加载列表中,从而阻止用户通过 HTTP 访问。
  • IncludeSubdomains:另一个指令,允许子域启用 HST,而不仅仅是顶级域名。
  • MaxAge: A property that determines the max-age directive of the Strict-Transport-Security header. This dictates how long the browser will remember to send requests for over HTTPS in seconds.

    笔记

    MaxAge属性值设置为 31536000 秒,可以保证HSTS头中的max age属性在至少一年期间被强制执行,还可以防止用户手动接受不受信任的 SSL 证书。

最后,对UseHsts方法的调用为 HST 添加了中间件。

还有更多…

在中使用严格传输安全头中的preload标志可能会给您的用户带来不良后果。当您在设置 HSTS 中间件时启用此属性时,请轻描淡写。例如,尝试通过 HTTP 再次浏览该站点:

Figure 4.3 – HSTS enabled/ browsing over HTTP

图 4.3–启用 HST/通过 HTTP 浏览

请注意,浏览器阻止您使用示例 ASP.NET web 应用。

笔记

并非所有浏览器都支持 HSTS 标头。要查看支持 HST 的浏览器列表,请参阅 Mozilla 开发者官方网站上的严格传输安全浏览器兼容性表 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security#browser_compatibility

修复弱协议

被称为 TLS 的加密协议经过多年的发展,最初是作为安全套接字层,大多数通常被称为SSL。这一点现在已被弃用,因此发现其后续产品的设计中存在漏洞。最新版本的传输层安全协议 TLS1.3 就是为了解决这些问题而创建的。

启用 HTTPS 和使用 TLS 不足以保护您的 ASP.NET Core web 应用免受意外数据泄露。对手可能利用 TLS 的弱版本进行攻击。要克服这一点,您必须使用最新和最好的加密密码和协议版本。

此配方将教您如何更改过时的 TLS 版本,并编写代码以利用 TLS 1.3 版本的协议。

准备好了吗

使用 Visual Studio 代码,打开位于\Chapter02\weak-protocol\before\OnlineBankingApp\的示例网上银行应用文件夹。

您可以执行此文件夹中的步骤来修复弱协议。

怎么做…

让我们来看看这个食谱的步骤:

  1. 在起始练习文件夹中,通过键入以下命令启动 Visual Studio 代码:

    cs code .

  2. 打开Program.cs类文件。此类设置主机,默认情况下,使用Kestrel作为 web 服务器。CreateHostBuilder方法调用用于定位SslProtocols属性被分配了更低版本 TLS 的行。当前值表示使用的 TLS 版本为版本TLS 1.0

    cs public static IHostBuilder CreateHostBuilder(string[]   args) =>     Host.CreateDefaultBuilder(args)         .ConfigureWebHostDefaults(host =>         {             host.UseKestrel(options =>                  {                     options.ConfigureHttpsDefaults                     (https =>                     {                         https.SslProtocols =                            SslProtocols.Tls;                     });         });         host.UseStartup<Startup>();     });

  3. 分配SslProtocols属性,以及更强大的 TLS 版本:

    cs options.ConfigureHttpsDefaults(https => {     https.SslProtocols = SslProtocols.Tls12 |         SslProtocols.Tls13; });

  4. 导航到菜单中的终端新终端或在 Visual Studio 代码中按Ctrl+Shift+即可。 ** 在终端中键入以下命令以构建并运行示例应用:

    cs dotnet run

    • F12打开浏览器的开发者工具。 进入网络选项卡,监控即将到来的流量。 打开浏览器并转到http://localhost:5000。您的浏览器将自动将您重定向到https://localhost:5001 转到开发者工具窗格的安全选项卡,查看安全连接详细信息:

*Figure 4.4 – Secure connection details

图 4.4–安全连接详细信息

安全选项卡显示正在使用的 TLS 协议版本的详细信息,以及密码。

它是如何工作的…

当前版本的代码使用较低且易受攻击的 TLS 版本。SslProtocols分配了一个枚举值SslProtocols.Tls,相当于TLS 1.0。截至 2020 年 3 月,TLS 1.0 已被弃用

此示例 ASP.NET Core web 应用中使用的默认 web 服务器是Kestrel*。在代码中,我们将 Kestrel 的设置配置为UseKestrel,将属性值作为选项传递。

其中一个属性是SslProtocols,我们应该使用SslProtocols.Tls12SslProtocols.Tls13管道枚举值来指定只允许TLS 1.2TLS 1.3使用。这些将被设置为我们的默认值。

固定硬编码加密密钥

加密密钥是整个加密生态系统的重要组成部分。此字符串对于加密和解密敏感数据至关重要。特别是,非对称密码算法具有私钥(作为公私密钥对交换的一部分),这意味着可以防止被窥探。如果这些密钥落入坏人手中或泄漏,攻击者将能够成功执行敏感数据解密。

笔记

应用密码学的主题是广泛而复杂的。本书在本章中简要介绍了弱加密算法,但要更全面地了解加密在.NET 中的实现方式,请阅读 Microsoft 官方在线文档中的.NET 加密模型 https://docs.microsoft.com/en-us/dotnet/standard/security/cryptography-model

下面的方法将帮助我们发现代码中的安全漏洞,该漏洞会破坏这些加密私钥,并通过代码修复来修复风险。

准备好了吗

使用 Visual Studio 代码,打开位于\Chapter04\hard-coded-key\before\OnlineBankingApp\的示例网上银行应用文件夹。

您可以执行此文件夹中的步骤来修复硬编码加密密钥。

怎么做…

让我们来看看这个食谱的步骤:

  1. 在起始练习文件夹中,通过键入以下命令启动 Visual Studio 代码:

    cs code .

  2. Open the \Areas\Identity\Pages\Account\Register.cshtml.cs file and go to the OnPostAsync method definition:

    cs public async Task<IActionResult> OnPostAsync(string returnUrl = null) {     returnUrl ??= Url.Content("~/");     ExternalLogins = (await         _signInManager.GetExternalAuthenticationScheme              sAsync()).ToList();     if (ModelState.IsValid)     {         var user = new Customer {             FirstName = _cryptoService.Encrypt                 (Input.FirstName, key),             MiddleName = _cryptoService.Encrypt                 (Input.MiddleName, key),             LastName = _cryptoService.Encrypt                 (Input.LastName, key),             DateOfBirth = Input.DateOfBirth,             UserName = Input.Email,             Email = Input.Email         };

    笔记

    完整的代码可以在本书的 GitHub 存储库中找到,网址为 https://github.com/PacktPublishing/ASP.NET-Core-Secure-Coding-Cookbook\第四章。

  3. 注意对_cryptoService.Encrypt方法的调用有第二个接受字符串的参数。此参数期望接收一个key,但正在传递的密钥是以代码形式硬编码的。key类字段被声明并分配了一个硬编码值BGw3UHkI4z

    cs [AllowAnonymous] public class RegisterModel : PageModel {     private readonly SignInManager<Customer>         _signInManager;     private readonly UserManager<Customer>        _userManager;     private readonly ILogger<RegisterModel> _logger;     private readonly IEmailSender _emailSender;     private readonly ICryptoService _cryptoService;     private const string key = "BGw3UHkI4z";

  4. 我们可以通过从安全环境(如环境变量)检索密钥来解决此问题。环境变量是您的操作系统中用于各种应用和服务的变量:

    cs FirstName = _cryptoService.Encrypt(Input.FirstName,     Environment.GetEnvironmentVariable("securekey",        EnvironmentVariableTarget.Machine)), MiddleName = _cryptoService.Encrypt(Input.MiddleName,Environment.GetEnvironmentVariable("securekey",        EnvironmentVariableTarget.Machine)), LastName = _cryptoService.Encrypt(Input.LastName,    Environment.GetEnvironmentVariable("securekey",        EnvironmentVariableTarget.Machine)),

  5. 我们可以使用Environment.GetEnvironmentVariable方法检索securekey环境变量中存储的密钥的值。

  6. Create the new securekey environment variable.

    如果您是 Windows 用户,请执行以下步骤:

    a) 打开 Windows运行提示,输入sysdm.cpl,然后按确定进入

    Figure 4.5 – Windows Run prompt

    图 4.5–Windows 运行提示

    b) 点击高级选项卡,然后点击环境变量按钮:

    Figure 4.6 – Advanced System Properties

    图 4.6–高级系统属性

    c) 在系统变量下,点击新建按钮新建系统范围变量:

    Figure 4.7 – Environment variables

    图 4.7–环境变量

    d) 指定系统变量的名称为securekey,其值为BGw3UHkI4z

    Figure 4.8 – securekey system variable

    图 4.8–securekey 系统变量

    e) 通过在命令行中键入以下命令,测试是否已创建新的系统变量:

    cs echo %securekey%

    前面的命令将在命令提示符中显示securekey系统变量的值。

    如果您是 Linux/MacOS 用户,请执行以下步骤:

    a) 打开主目录中的.bashrc文件。键入以下命令以使用 gedit 文本编辑器打开.bashrc文件:

    cs gedit ~/.bashrc

    键入以下命令以使用 vim 文本编辑器打开.bashrc文件:

    cs vi  ~/.bashrc

    .bashrc是一个 shell 脚本,Bash 执行该脚本以初始化交互式 shell 会话。

    下面的屏幕截图显示了在基于 GNOME 的桌面环境中的默认文本编辑器gedit中打开的.bashrc文件。这在 Linux 上很常见:

    Figure 4.9 – .bashrc file opened for modification

    图 4.9–.bashrc 文件打开进行修改

    b) 使用您选择的代码编辑器(vim 或 gedit),将以下行添加到您的.bashrc文件中:

    cs export securekey=" BGw3UHkI4z"

    以下屏幕截图显示添加了新环境变量的 gedit 文本编辑器:

    Figure 4.10 – New environment variable

    图 4.10–新环境变量

    c) 保存.bashrc文件以应用更改。

    d) 打开一个新终端,然后键入以下命令以验证环境变量现在是否存在:

    cs echo $securekey

    以下屏幕截图显示新的securekey环境变量已成功添加:

    Figure 4.11 – New Terminal

    图 4.11–新航站楼

  7. Lastly, remove the following line, which declares the key variable:

    cs     private const string key = "BGw3UHkI4z";

    提示

    对于大规模部署,将机密和密钥存储在环境变量中可能并不理想。作为一种选择,可以使用基于云的密钥存储,例如Azure 密钥库。按照快速入门说明在 Azure Key Vault 中存储您的机密:https://docs.microsoft.com/en-us/azure/key-vault/secrets/quick-create-net

现在,让我们了解一下这个配方是如何工作的。

它是如何工作的…

如果攻击者能够获得代码存储库,那么坏的参与者就有可能在代码中看到私钥。我们必须保护这些密钥,并且它们必须从代码存储库外部存储,从而将能够看到它们的人限制在能够访问系统的任何人。在我们的示例网上银行应用中,密钥在代码中明确声明为变量:

private const string key = "BGw3UHkI4z";

这是由于未经授权的访问而导致意外暴露的风险,但可以通过将密钥存储在环境变量中来解决。

在这里,我们创建了一个系统变量,使其在机器范围内可访问,并通过调用Environment.GetEnvironmentVariable方法检索密钥:

FirstName = _cryptoService.Encrypt(Input.FirstName,    Environment.GetEnvironmentVariable("securekey",        EnvironmentVariableTarget.Machine)),

第一个参数是环境变量的名称,而第二个参数指定存储密钥的位置。可能的enum值为EnvironmentVariableTarget.MachineEnvironmentVariableTarget.ProcessEnvironmentVariableTarget.User

我们使用EnvironmentVariableTarget.Machine表示我们的变量存储在 Windows 注册表中。它的确切位置是 Windows 注册表HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment

笔记

您可以使用构建管道将环境变量添加到 web 服务器的过程自动化。如果您使用的是Azure 管道,您可以通过阅读 Microsoft 文档中的定义变量部分了解更多信息 https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch

还有更多…

ASP.NET Core web 应用开发人员的另一个选择是使用基于云的服务来存储密钥和机密。主要的云提供商提供这种类型的服务,并允许您管理使用硬件安全模块的加密密钥

要将这些服务集成到 ASP.NET web 应用中,您必须订阅并使用其特定的软件开发工具包。以下是其中两个:

  • Azure 密钥库:将与此服务集成需要您安装Azure SDK并使用 ASP.NET Core 的Azure 密钥库配置提供程序检索密钥。
  • AWS 密钥管理服务(KMS)AWS SDK for.NET将帮助您快速将 KMS 服务添加到 ASP.NET Core web 应用中。

现在,让我们继续下一个食谱。

禁用关键网页的缓存

性能是 ASP.NET Core web 应用的关键指标之一。作为开发人员,我们找到了使页面加载更快的方法,而缓存资源和页面的概念并不是什么新鲜事。浏览器根据从服务器接收的缓存控制指令实现缓存。但是,缓存包含敏感数据的页面存在相关风险。我们必须有选择地确定哪些页面有泄漏信息的危险,并禁用这些页面的缓存。

准备好了吗

我们将使用上一个配方中使用的在线银行应用。使用 Visual Studio 代码,打开位于\Chapter04\cache-data\before\OnlineBankingApp\的示例网上银行应用文件夹。

您可以执行此文件夹中的步骤,在管理配置文件页面上禁用缓存。

怎么做…

让我们来看看这个食谱的步骤:

  1. 在起始练习文件夹中,通过键入以下命令启动 Visual Studio 代码:

    cs code .

  2. Open the Areas\Identity\Pages\Account\Manage\Index.cshtml.cs file. Notice that there is no annotation for the page model, which typically controls response caching:

    cs namespace OnlineBankingApp.Areas.Identity.Pages.Account.Manage {     public partial class IndexModel : PageModel     {

    此页面允许您管理您的个人资料并更改您的个人详细信息,如您的名字、姓氏和出生日期。打开缓存时查看这些页面可能会导致信息泄漏,因为浏览器会缓存数据,除非指示不这样做。

  3. To disable caching on this particular Razor page, let's annotate the page mode with the ResponseCache attribute:

    cs namespace OnlineBankingApp.Areas.Identity.Pages.Account.  Manage {     [ResponseCache(Duration = 0, Location =         ResponseCacheLocation.None, NoStore = true)]     public partial class IndexModel : PageModel     {         private readonly UserManager<Customer>            _userManager;         private readonly SignInManager<Customer>            _signInManager;

    添加ResponseCache属性将设置缓存控制响应头的指令。

现在,让我们验证一下作为 HTTP 响应的一部分,是否已将缓存控制设置为无缓存、无存储

正在验证缓存控制 HTTP 响应头

让我们开始吧:

  1. 导航到菜单中的终端新终端或在 Visual Studio 代码中按Ctrl+Shift+即可。 ** 在终端中键入以下命令以构建并运行示例应用:

    cs dotnet run

    • 打开浏览器并转到https://localhost:5001/。* Log in using the following credentials:

    a) 。电邮:stanley.s.jobson@lobortis.ca

    b) 。密码:rUj5jtV8jrTyHnx!

    • Once authenticated, you will be redirected to the home page:

    Figure 4.12 – Home page authenticated

    图 4.12–主页验证

    • Click stanley.s.jobson@lobortis.ca from the banner to go to the customer's profile page:

    Figure 4.13 – Profile page

    图 4.13–配置文件页面

    • F12打开浏览器的开发者工具。 进入网络选项卡,在流量列表中选择第一条 HTTP 流量。 选择单一 HTTP 流量后,滚动右窗格以查看相应的 HTTP 响应安全标头:*

*Figure 4.14 – Cache-Control

图 4.14–缓存控制

缓存控制头现在已添加为 HTTP 响应的一部分,该响应是从我们的示例网上银行 web 应用发送的。

它是如何工作的…

缓存控制设置为无存储,无缓存告知浏览器不缓存响应。您可以通过使用具有以下属性及其相应值的ResponseCache属性并注释IndexModel来实现这一点:

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]

Duration设置为0秒,因此将其匹配的max-age指令设置为相同的值。将max-age赋值为0秒表示应该从 web 服务器重新检索资源。

Location被分配了一个enumResponseCacheLocation.None,该值指定浏览器不会缓存资源。

NoStore设置为true时,配置no-store指令 HTTP 响应头,告知客户端不缓存资源。

提示:

您可以通过创建CacheProfiles集中配置 ASP.NET Core web 应用的缓存行为:

using Microsoft.AspNetCore.Mvc;

...

public void ConfigureServices(IServiceCollection services)

{

...

services.AddMvc(options =>

{

options.CacheProfiles.Add("NoCache",

new CacheProfile()

{

Duration = 30,

Location = ResponseCacheLocation. None,

NoStore = true

});

});

前面配方中相同的值已传递到CacheProfile实例以禁用缓存。*