通过使用 System.Web 适配器迁移 ASP.NET machineKey

注释

这利用 System.Web 适配器 来简化迁移。

在 ASP.NET Framework 应用中,配置 <machineKey> 和 System.Web 适配器主机,以便两个应用可以共享兼容的数据保护配置。 有关替换 <machineKey>的完整背景信息,请参阅 在 ASP.NET Core 中替换 ASP.NET machineKey

本指南基于 System.Web 适配器托管模型构建,以便在主机依赖项注入(DI)容器中注册数据保护服务,并在 ASP.NET 框架应用中提供。 通过与适配器提供的主机 DI 集成,现有 ASP.NET 框架组件可以解析IDataProtectionProviderIDataProtector和相关类型。

ASP.NET Framework 应用和 ASP.NET Core 应用都必须使用共享应用程序名称和密钥存储库进行数据保护,以便受保护的有效负载可以在应用之间往返。

  • 在两款应用程序中使用相同的应用名称调用SetApplicationName(例如,"my-app")。
  • 配置为 PersistKeysToFileSystem 指向两个应用都可以读取和写入的同一密钥存储库位置。

注释

使用的 PersistKeysToFileSystem 目录是共享数据保护密钥的后盾存储。 在生产环境中,使用持久共享存储(如 UNC 共享、Redis 或 Azure Blob 存储),并遵循 配置 ASP.NET Core Data ProtectionASP.NET Core Data Protection 概述中的密钥管理指南。

配置 ASP.NET Framework 应用

若要在 ASP.NET Framework 应用中实现此配置,请确保包 Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices 安装在 ASP.NET Framework 应用中。

在 ASP.NET Framework 应用中安装 Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices 包时,它通常会自动配置 <machineKey> 。 如果 <machineKey> 不存在或需要验证设置,请在 Web.config 中配置“”以使用兼容性数据保护程序,如下所示:

<configuration>
  <system.web>
    <httpRuntime targetFramework="4.8.1" />
    <machineKey
      compatibilityMode="Framework45"
      dataProtectorType="Microsoft.AspNetCore.DataProtection.SystemWeb.CompatibilityDataProtector,
      Microsoft.AspNetCore.DataProtection.SystemWeb" />
  </system.web>
</configuration>

接下来,注册 Global.asax.csSystem.Web 适配器主机,并使用 ASP.NET Core 应用将使用的应用程序名称和密钥存储库配置数据保护。 以下示例改编自 MachineKey Framework 示例:

using System.IO;
using System.Web;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.SystemWebAdapters.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace DataProtectionDemo
{
    public class MvcApplication : HttpApplication
    {
        protected void Application_Start()
        {
            HttpApplicationHost.RegisterHost(builder =>
            {
                builder.AddServiceDefaults();

                builder.AddDataProtection()
                    .SetApplicationName("my-app")
                    .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\myapp-keys\"));
            });
        }
    }
}

此配置:

  • 设置 ASP.NET 核心应用还必须使用的共享应用程序名称(my-app)。
  • 配置两个应用可以访问的共享密钥存储库(例如 UNC 共享)。
  • 确保<machineKey>操作(表单身份验证、视图状态、MachineKey.Protect以及相关 API)通过 ASP.NET Core 数据保护进行路由。
  • 作为 ASP.NET Framework 主机的一部分运行,这样基于现有 <machineKey> 的功能可以使用与 ASP.NET Core 相同的数据保护系统。

配置 ASP.NET Core 应用

ASP.NET Core 应用中的数据保护不需要其他配置。 只需配置 ASP.NET Framework 应用使用的相同应用程序名称和密钥存储位置。

using Microsoft.AspNetCore.DataProtection;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDataProtection()
    .SetApplicationName(MachineKeyExampleHandler.AppName)
    .PersistKeysToFileSystem(
        new DirectoryInfo(Path.Combine(Path.GetTempPath(), "sharedkeys", MachineKeyExampleHandler.AppName)));

var app = builder.Build();

// Configure application

app.Run();