.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
相关产品推荐
相关产品推荐

