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

.NET 7 ECS Fargate部署后需重新Google OIDC认证问题

问题分析

问题核心在于.NET默认的DataProtection密钥本地存储机制:ECS Fargate每次部署新任务都是全新容器实例,没有旧任务的密钥,无法解密之前生成的认证Cookie,导致认证失效被重定向到登录页。而本地重启时,密钥仍保存在本地磁盘,所以能正常解密Cookie保持登录状态。

解决方法

1. 配置DataProtection使用共享密钥存储

让所有ECS任务共享同一个DataProtection密钥库,无论部署多少次新任务,都能解密旧的认证Cookie。推荐用AWS S3存储密钥,配合KMS加密保证安全。

在Program.cs中添加DataProtection配置:

using Microsoft.AspNetCore.DataProtection;
using Amazon.S3;
using Amazon.KeyManagementService;

// 配置DataProtection使用S3存储密钥,KMS加密
builder.Services.AddDataProtection()
    .PersistKeysToAwsS3(new AmazonS3Client(), "你的S3存储桶名称", "data-protection-keys/")
    .ProtectKeysWithAwsKms(new AmazonKmsClient(), "你的KMS密钥ARN");

注意:需要给ECS任务的IAM角色添加S3读写权限,以及KMS加密解密权限。

2. 优化Cookie安全配置(补充项)

确保生产环境下Cookie的安全属性配置正确,避免额外问题:

.AddCookie(options =>
{
    options.Cookie.Name = "AppAuth";
    options.ExpireTimeSpan = TimeSpan.FromHours(12);
    options.SlidingExpiration = false;
    // 生产环境强制启用Secure和HttpOnly
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
    options.Cookie.HttpOnly = true;
    options.Cookie.SameSite = SameSiteMode.Lax;
    // ... 保留原有OnValidatePrincipal等配置
})

3. 验证粘性会话配置(可选)

虽然你已开启粘性会话,但部署过程中可能存在新旧任务短暂共存的情况。确认负载均衡器(如ALB)的粘性会话配置是否正确,不过只要完成第一步的密钥共享,即使请求打到新任务也能正常解密Cookie,这一步是辅助验证。

另外,你的OnValidatePrincipal事件中每次调用SignInAsync重新生成Cookie,在密钥共享的前提下不会有问题;如果密钥不共享,新生成的Cookie其他任务无法识别,因此第一步是核心解决措施。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:42:42