在 ASP.NET Core 中替换 ASP.NET machineKey

ASP.NET 中 <machineKey> 元素的实现是可替换的。 这允许通过替换数据保护机制(包括新的数据保护系统)路由对 ASP.NET 加密例程的大多数调用。

包安装

注意

新的数据保护系统只能安装到面向 .NET 4.5.1 或更高版本的现有 ASP.NET 应用程序中。 如果应用程序面向 .NET 4.5 或更低版本,安装将失败。

若要将新的数据保护系统安装到现有的 ASP.NET 4.5.1+ 项目,请安装 Microsoft.AspNetCore.DataProtection.SystemWeb 包。 这将使用默认配置设置实例化数据保护系统。

安装该包时,它会在 Web.config 中插入一行,告诉 ASP.NET 将其用于大多数加密操作,包括 Forms 身份验证、视图状态和对 MachineKey.Protect 的调用。 它不使用数据保护 API。 插入的行如下所示。

<machineKey compatibilityMode="Framework45" dataProtectorType="..." />

提示

你可以通过检查 __VIEWSTATE 等字段来判断新的数据保护系统是否处于活动状态,该字段应以“CfDJ8”开头,如以下示例所示。 “CfDJ8”是“09 F0 C9 F0”magic 标头的 base64 表示形式,该标头用于标识数据保护系统保护的有效负载。

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="CfDJ8AWPr2EQPTBGs3L2GCZOpk...">

包配置

数据保护系统使用默认的零设置配置进行实例化。 但是,由于密钥默认保存在本地文件系统中,因此这不适用于部署在场中的应用程序。 若要解决此问题,可以通过创建子类为 DataProtectionStartup 并替代其 ConfigureServices 方法的类型来提供配置。

下面是自定义数据保护启动类型的示例,它配置了密钥的保存位置和在 rest 的加密方式。 它还通过提供自己的应用程序名称来替代默认应用隔离策略。

using System;
using System.IO;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.DataProtection.SystemWeb;
using Microsoft.Extensions.DependencyInjection;

namespace DataProtectionDemo
{
    public class MyDataProtectionStartup : DataProtectionStartup
    {
        public override void ConfigureServices(IServiceCollection services)
        {
            services.AddDataProtection()
                .SetApplicationName("my-app")
                .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\myapp-keys\"))
                .ProtectKeysWithCertificate("thumbprint");
        }
    }
}

提示

你还可以使用 <machineKey applicationName="my-app" ... /> 来代替对 SetApplicationName 的显式调用。 这种便捷机制可避免强制开发人员创建 DataProtectionStartup 派生类型,适用于开发人员只想设置应用程序名称的情况。

若要启用此自定义配置,请返回 Web.config 并查找包安装添加到配置文件的 <appSettings> 元素。 它将如以下标记所示:

<appSettings>
  <!--
  If you want to customize the behavior of the ASP.NET Core Data Protection stack, set the
  "aspnet:dataProtectionStartupType" switch below to be the fully-qualified name of a
  type which subclasses Microsoft.AspNetCore.DataProtection.SystemWeb.DataProtectionStartup.
  -->
  <add key="aspnet:dataProtectionStartupType" value="" />
</appSettings>

使用刚刚创建的 DataProtectionStartup 派生类型的程序集限定名称填充空白值。 如果应用程序的名称是 DataProtectionDemo,则如下所示。

<add key="aspnet:dataProtectionStartupType"
     value="DataProtectionDemo.MyDataProtectionStartup, DataProtectionDemo" />

现在可以在应用程序中使用新配置的数据保护系统。