You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Cookie密钥存储到Azure Blob后多应用共享失效问题

.NET跨应用Cookie共享故障排查(Azure Blob+Key Vault密钥存储场景)

问题背景

身份提供商为.NET 4.7.2应用,对接3个.NET 4.7.2、1个.NET 7子应用。原架构通过文件共享存储未加密密钥,所有.NET 4.7.2应用代码一致,Cookie共享正常。

修改后采用DataProtection.CreateProvider将密钥持久化到Azure Blob,并用Key Vault保护密钥,所有应用代码及配置一致。目前认证应用登录正常,Cookie已设置为localhost域,但子应用(如localhost/IAM)访问时返回401并跳转回登录页。已确认Blob中密钥文件正常,尝试移除Key Vault保护、删除Blob重建,问题依旧。

排查方向及解决方案建议

1. 强制统一DataProtection核心配置

DataProtection的ApplicationName是跨应用共享密钥的核心标识,必须完全一致:

  • .NET 4.7.2应用:创建DataProtectionProvider时显式指定ApplicationName
    var provider = DataProtectionProvider.Create(new DirectoryInfo(@"BlobStoragePath"), config =>
    {
        config.SetApplicationName("Your_Shared_App_Name");
        config.PersistKeysToAzureBlobStorage("BlobConnectionString", "ContainerName");
        config.ProtectKeysWithAzureKeyVault("KeyVaultKeyUri", "ClientId", "ClientSecret");
    });
    
  • .NET 7应用:添加Microsoft.AspNetCore.DataProtection.SystemWeb包后,在AddDataProtection中设置相同的ApplicationName
    builder.Services.AddDataProtection()
        .SetApplicationName("Your_Shared_App_Name")
        .PersistKeysToAzureBlobStorage(new Uri("https://yourstorage.blob.core.windows.net/keys"), new DefaultAzureCredential())
        .ProtectKeysWithAzureKeyVault(new Uri("https://yourvault.vault.azure.net/keys/yourkey"), new DefaultAzureCredential());
    

同时确认所有应用的Blob容器地址、Key Vault密钥URI完全匹配。

2. 修正Cookie域与属性配置

浏览器对localhost域的Cookie处理存在特殊性,需调整配置:

  • 将Cookie的Domain设置为.localhost(注意前缀的点),确保覆盖所有子路径/子应用
  • 强制设置Cookie的Path为/,避免路径限制导致Cookie无法传递
  • 本地调试时,将SameSite属性设为SameSiteMode.Lax或SameSiteMode.None(启用HTTPS时配合Secure=true),避免Strict模式阻止跨路径Cookie传递

3. 验证.NET 7应用的兼容性配置

.NET 7与.NET Framework的DataProtection实现存在差异,需额外适配:

  • 必须安装Microsoft.AspNetCore.DataProtection.SystemWeb NuGet包,确保.NET 7能识别.NET Framework生成的认证Cookie
  • 确认.NET 7应用的认证中间件配置与身份提供商一致,例如Cookie名称、认证Scheme:
    builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options =>
        {
            options.Cookie.Name = "Your_Shared_Cookie_Name";
            options.Cookie.Domain = ".localhost";
            options.Cookie.Path = "/";
        });
    

4. 密钥解密权限与流程验证

即使Blob中存在密钥,也要确保应用能正确解密:

  • 检查Key Vault访问权限:所有应用的服务主体(或托管标识)需拥有Key Vault Crypto User角色权限,确保能执行密钥的解密操作
  • 临时禁用Key Vault加密,改用本地DPAPI加密测试:
    // .NET 4.7.2示例
    config.ProtectKeysWithDpapi();
    // .NET 7示例
    builder.Services.AddDataProtection().ProtectKeysWithDpapi();
    

如果此时Cookie共享恢复正常,说明Key Vault的权限或密钥配置仍存在问题,需重新核对密钥URI、权限设置。

5. 浏览器端Cookie验证

通过浏览器开发者工具(F12)确认:

  • 登录后生成的Cookie存在,Domain为.localhost、Path为/
  • 访问子应用时,请求头中携带了该Cookie;若未携带,说明浏览器因Domain/Path/SameSite配置拒绝发送

内容的提问来源于stack exchange,提问作者Dars

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:23:10