注释
这利用 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 Protection 和 ASP.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();