如何生成COMMON KEY RING以在ASP.NET Core(.NET 8)子域间共享Cookie?
要实现主域和子域的认证Cookie共享,核心是让所有关联应用使用同一套数据保护密钥环(Common Key Ring),这样它们能解密彼此生成的认证Cookie。以下是具体生成和配置步骤:
一、本地开发环境
1. 创建共享密钥存储目录
在本地磁盘创建专门目录存放共享密钥,比如:
- Windows:
C:\SharedAuthKeys - Linux/macOS:
/var/shared_auth_keys
2. 生成密钥到共享目录
打开终端,执行命令生成密钥并持久化到上述目录(需安装.NET 8 SDK):
dotnet data-protection key generate --destination "C:\SharedAuthKeys" --purpose "CrossDomainAuthCookies"
执行后目录会生成含密钥的XML文件,所有应用将共用这套密钥。
3. 配置所有应用指向共享密钥
在每个需共享Cookie的应用的Program.cs中添加DataProtection配置:
builder.Services.AddDataProtection() // 指定共享密钥存储目录 .PersistKeysToFileSystem(new DirectoryInfo(@"C:\SharedAuthKeys")) // 所有应用必须设置相同的应用名称,保证密钥上下文一致 .SetApplicationName("YourSharedAppName");
二、生产环境
生产环境不建议用本地目录存密钥,推荐以下两种方式:
方法1:使用专业密钥管理服务
配置DataProtection从密钥管理服务读取密钥,示例代码(以Azure Key Vault为例):
builder.Services.AddDataProtection() .PersistKeysToAzureBlobStorage(new Uri("https://yourvault.blob.core.windows.net/keys/keys.xml")) .ProtectKeysWithAzureKeyVault(new Uri("https://yourvault.vault.azure.net/keys/DataProtectionKey"), new DefaultAzureCredential()) .SetApplicationName("YourSharedAppName");
所有应用需配置相同的密钥存储地址和应用名称。
方法2:手动生成密钥并注入配置
- 生成密钥XML文件:
dotnet data-protection key generate --format xml --output key.xml
- 将XML内容复制到所有应用的安全配置中(建议用环境变量或配置中心,避免硬编码):
{ "DataProtection": { "Keys": [ "<生成的XML密钥内容>" ] } }
- 在
Program.cs中配置读取密钥:
builder.Services.AddDataProtection() .PersistKeysToConfiguration(builder.Configuration.GetSection("DataProtection:Keys")) .SetApplicationName("YourSharedAppName");
三、配套Cookie配置
除密钥环外,所有应用需统一认证Cookie配置:
builder.Services.ConfigureApplicationCookie(options => { // 设置主域,确保子域可访问Cookie,比如.example.com options.Cookie.Domain = ".yourdomain.com"; // 所有应用使用相同的Cookie名称 options.Cookie.Name = ".SharedAuthCookie"; // 其他Cookie配置(过期时间、路径等)保持一致 });
内容的提问来源于stack exchange,提问作者Davood
相关产品推荐
相关产品推荐

