传输中和静止时的数据保护至关重要。确保使用强大的传输协议和 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 builddotnet build命令将构建示例OnlineBankingApp项目及其依赖项。
让我们来看看这个配方的步骤:
-
在“开始练习”文件夹中,通过键入以下命令来启动 Visual Studio 代码:
code .
-
Open the
Startup.csclass file and add the following code before the closing braces of theConfigureServicesmethod: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执行临时重定向或永久重定向。 -
在
Configure方法app.UseHttpsRedirection();
中对
UseStaticFiles的调用之前添加对UseHttpsRedirection方法的调用 -
Open the
launchsettings.jsonfile and change the values inapplicationUrlandenvironmentVariables, as shown in the following highlighted code:"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。 -
在菜单中导航至终端****新终端或在 Visual Studio 代码中按Ctrl+Shift+即可。 ** 在终端中键入以下命令以构建并运行示例应用:
dotnet run
- 打开浏览器,进入
http://localhost:5000:*
- 打开浏览器,进入
图 4.1–启用 HTTPS
请注意,样本溶液被重定向到https://localhost:5001。
笔记
Web API 超出了本书的范围,但需要注意的是,必须在 API 中禁用 HTTP 重定向*。Web API 还应拒绝 HTTP中的请求,并返回HTTP 400状态码。*
在Startup类中,我们调用AddHttpsRedirection方法向服务集合注册UseHttpsRedirection。我们通过设置两个属性来配置中间件选项:RedirectStatusCode和HttpsPort。默认情况下,RedirectStatusCode为Status307TemporaryRedirect,但在生产环境中应更改为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 。
HTTP 严格传输安全或HSTS是另一种帮助防止中间人攻击的 web 应用安全机制。它允许 web 服务器发送一个特殊的 HTTP 响应头,通知支持浏览器后续的通信和数据传输只能通过 HTTPS 完成;否则,将不允许后续连接。
未能选择加入 HSTS 作为附加安全策略并不能消除敏感数据拦截的威胁。用 HST 补充 HTTPS 将阻止用户暴露于未加密通道的风险。
这个方法将教会我们如何启用示例 ASP.NET Core web 应用中缺失的 HST,以强制客户端完全通过 HTTPS 进行通信。
我们将使用上一个配方中使用的在线银行应用。使用 Visual Studio 代码,打开位于\Chapter04\missing-hsts\before\OnlineBankingApp\的示例网上银行应用文件夹。
您可以执行此文件夹中的步骤来修复丢失的 HSTS 标头。
让我们来看看这个食谱的步骤:
-
在起始练习文件夹中,通过键入以下命令启动 Visual Studio 代码:
code .
-
Open the
Startup.csclass file and add the following code before theAddHttpsRedirectioncall of theConfigureServicesmethod: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; }); }
提示
调用
ExcludedHostsProperty的Clear方法用于在本地和开发中测试 HST。此方法阻止localhost被排除,因为它是环回主机。此代码必须在生产环境中删除。您还可以为本地主机和/或开发环境主机添加排除选项作为替代:
options.ExcludedHosts.Add("localhost");当 HST 设置不正确时,在本地测试 HST 可能会导致一些意外错误。遇到错误时,必须清除 HSTS 缓存。
-
添加对
UseHsts方法if (webHostEnv.IsDevelopment()) { appBuilder.UseDeveloperExceptionPage(); } else { appBuilder.UseExceptionHandler("/Error"); appBuilder.UseHsts(); }
的调用
-
为了使
IsDevelopment方法返回false并使我们能够在本地测试 HST,我们需要临时更改环境变量。打开`Chapter04\missing-hsts\before\OnlineBankingApp\Properties\launchSettings.json并找到ASPNETCORE_ENVIRONMENT节点。将数值从Development更改为Staging`:"environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Staging", "ASPNETCORE_URLS": "http://localhost:5000;https://localhost:5001" }
-
导航到菜单中的终端****新终端或在 Visual Studio 代码中按Ctrl+Shift+即可。 ** 在终端中键入以下命令以构建并运行示例应用:
dotnet run
- 按F12打开浏览器的开发者工具。* 进入网络选项卡,监控即将到来的流量。* Open a browser and go to
http://localhost:5000.
您的浏览器将自动将您重定向到
https://localhost:5001。- 在开发者工具窗格的网络选项卡中,选择已发送到本地主机的第二组 HTTP 流量,并检查 HTTP 响应头:*
- 按F12打开浏览器的开发者工具。* 进入网络选项卡,监控即将到来的流量。* Open a browser and go to
图 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 再次浏览该站点:
图 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\的示例网上银行应用文件夹。
您可以执行此文件夹中的步骤来修复弱协议。
让我们来看看这个食谱的步骤:
-
在起始练习文件夹中,通过键入以下命令启动 Visual Studio 代码:
code .
-
打开
Program.cs类文件。此类设置主机,默认情况下,使用Kestrel作为 web 服务器。CreateHostBuilder方法调用用于定位SslProtocols属性被分配了更低版本 TLS 的行。当前值表示使用的 TLS 版本为版本TLS 1.0:public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(host => { host.UseKestrel(options => { options.ConfigureHttpsDefaults (https => { https.SslProtocols = SslProtocols.Tls; }); }); host.UseStartup<Startup>(); });
-
分配
SslProtocols属性,以及更强大的 TLS 版本:options.ConfigureHttpsDefaults(https => { https.SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls13; });
-
导航到菜单中的终端****新终端或在 Visual Studio 代码中按Ctrl+Shift+即可。 ** 在终端中键入以下命令以构建并运行示例应用:
dotnet run
- 按F12打开浏览器的开发者工具。* 进入网络选项卡,监控即将到来的流量。* 打开浏览器并转到
http://localhost:5000。您的浏览器将自动将您重定向到https://localhost:5001。* 转到开发者工具窗格的安全选项卡,查看安全连接详细信息:*
- 按F12打开浏览器的开发者工具。* 进入网络选项卡,监控即将到来的流量。* 打开浏览器并转到
图 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.Tls12和SslProtocols.Tls13管道枚举值来指定只允许TLS 1.2和TLS 1.3使用。这些将被设置为我们的默认值。
加密密钥是整个加密生态系统的重要组成部分。此字符串对于加密和解密敏感数据至关重要。特别是,非对称密码算法具有私钥(作为公私密钥对交换的一部分),这意味着可以防止被窥探。如果这些密钥落入坏人手中或泄漏,攻击者将能够成功执行敏感数据解密。
笔记
应用密码学的主题是广泛而复杂的。本书在本章中简要介绍了弱加密算法,但要更全面地了解加密在.NET 中的实现方式,请阅读 Microsoft 官方在线文档中的*.NET 加密模型* https://docs.microsoft.com/en-us/dotnet/standard/security/cryptography-model 。
下面的方法将帮助我们发现代码中的安全漏洞,该漏洞会破坏这些加密私钥,并通过代码修复来修复风险。
使用 Visual Studio 代码,打开位于\Chapter04\hard-coded-key\before\OnlineBankingApp\的示例网上银行应用文件夹。
您可以执行此文件夹中的步骤来修复硬编码加密密钥。
让我们来看看这个食谱的步骤:
-
在起始练习文件夹中,通过键入以下命令启动 Visual Studio 代码:
code .
-
Open the
\Areas\Identity\Pages\Account\Register.cshtml.csfile and go to theOnPostAsyncmethod definition: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\第四章。
-
注意对
_cryptoService.Encrypt方法的调用有第二个接受字符串的参数。此参数期望接收一个key,但正在传递的密钥是以代码形式硬编码的。key类字段被声明并分配了一个硬编码值BGw3UHkI4z:[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";
-
我们可以通过从安全环境(如环境变量)检索密钥来解决此问题。环境变量是您的操作系统中用于各种应用和服务的变量:
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)),
-
我们可以使用
Environment.GetEnvironmentVariable方法检索securekey环境变量中存储的密钥的值。 -
Create the new
securekeyenvironment variable.如果您是 Windows 用户,请执行以下步骤:
a) 打开 Windows运行提示,输入
sysdm.cpl,然后按确定或进入:图 4.5–Windows 运行提示
b) 点击高级选项卡,然后点击环境变量按钮:
图 4.6–高级系统属性
c) 在系统变量下,点击新建按钮新建系统范围变量:
图 4.7–环境变量
d) 指定系统变量的名称为
securekey,其值为BGw3UHkI4z:图 4.8–securekey 系统变量
e) 通过在命令行中键入以下命令,测试是否已创建新的系统变量:
echo %securekey%
前面的命令将在命令提示符中显示
securekey系统变量的值。如果您是 Linux/MacOS 用户,请执行以下步骤:
a) 打开主目录中的
.bashrc文件。键入以下命令以使用 gedit 文本编辑器打开.bashrc文件:gedit ~/.bashrc
键入以下命令以使用 vim 文本编辑器打开
.bashrc文件:vi ~/.bashrc
.bashrc是一个 shell 脚本,Bash 执行该脚本以初始化交互式 shell 会话。下面的屏幕截图显示了在基于 GNOME 的桌面环境中的默认文本编辑器gedit中打开的
.bashrc文件。这在 Linux 上很常见:图 4.9–.bashrc 文件打开进行修改
b) 使用您选择的代码编辑器(vim 或 gedit),将以下行添加到您的
.bashrc文件中:export securekey=" BGw3UHkI4z"
以下屏幕截图显示添加了新环境变量的 gedit 文本编辑器:
图 4.10–新环境变量
c) 保存
.bashrc文件以应用更改。d) 打开一个新终端,然后键入以下命令以验证环境变量现在是否存在:
echo $securekey
以下屏幕截图显示新的
securekey环境变量已成功添加:图 4.11–新航站楼
-
Lastly, remove the following line, which declares the
keyvariable: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.Machine、EnvironmentVariableTarget.Process和EnvironmentVariableTarget.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\的示例网上银行应用文件夹。
您可以执行此文件夹中的步骤,在管理配置文件页面上禁用缓存。
让我们来看看这个食谱的步骤:
-
在起始练习文件夹中,通过键入以下命令启动 Visual Studio 代码:
code .
-
Open the
Areas\Identity\Pages\Account\Manage\Index.cshtml.csfile. Notice that there is no annotation for the page model, which typically controls response caching:namespace OnlineBankingApp.Areas.Identity.Pages.Account.Manage { public partial class IndexModel : PageModel {
此页面允许您管理您的个人资料并更改您的个人详细信息,如您的名字、姓氏和出生日期。打开缓存时查看这些页面可能会导致信息泄漏,因为浏览器会缓存数据,除非指示不这样做。
-
To disable caching on this particular Razor page, let's annotate the page mode with the
ResponseCacheattribute: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 响应的一部分,是否已将缓存控制设置为无缓存、无存储。
让我们开始吧:
-
导航到菜单中的终端****新终端或在 Visual Studio 代码中按Ctrl+Shift+即可。 ** 在终端中键入以下命令以构建并运行示例应用:
dotnet run
- 打开浏览器并转到
https://localhost:5001/。* Log in using the following credentials:
a) 。电邮:
stanley.s.jobson@lobortis.cab) 。密码:
rUj5jtV8jrTyHnx!- Once authenticated, you will be redirected to the home page:
图 4.12–主页验证
- Click stanley.s.jobson@lobortis.ca from the banner to go to the customer's profile page:
图 4.13–配置文件页面
- 按F12打开浏览器的开发者工具。* 进入网络选项卡,在流量列表中选择第一条 HTTP 流量。* 选择单一 HTTP 流量后,滚动右窗格以查看相应的 HTTP 响应安全标头:*
- 打开浏览器并转到
图 4.14–缓存控制
缓存控制头现在已添加为 HTTP 响应的一部分,该响应是从我们的示例网上银行 web 应用发送的。
将缓存控制设置为无存储,无缓存告知浏览器不缓存响应。您可以通过使用具有以下属性及其相应值的ResponseCache属性并注释IndexModel来实现这一点:
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]Duration设置为0秒,因此将其匹配的max-age指令设置为相同的值。将max-age赋值为0秒表示应该从 web 服务器重新检索资源。
Location被分配了一个enum值ResponseCacheLocation.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实例以禁用缓存。*****













