跨子域共享ASP.NET Core身份验证Cookie问题求助
1. 正确配置Cookie认证核心参数
在Startup.cs的ConfigureServices方法中,统一Cookie的名称、域、安全策略和SameSite属性,确保所有子域应用使用一致配置:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Cookie.Name = "SharedAuthCookie"; // 所有子域应用共用此Cookie名称 options.Cookie.Domain = ".your-root-domain.com"; // 根域前加英文点,覆盖所有子域 options.Cookie.SameSite = SameSiteMode.None; // 跨域场景必须设置为None,需配合HTTPS options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 强制Cookie仅通过HTTPS传输 });
2. 配置统一的数据保护系统
ASP.NET Core通过数据保护加密Cookie,所有子域应用必须使用相同的密钥存储和应用标识,否则无法解密彼此的Cookie:
services.AddDataProtection() .SetApplicationName("YourGlobalAppIdentifier") // 所有子域应用使用同一标识 .PersistKeysToFileSystem(new DirectoryInfo("/var/shared-auth-keys")); // Linux上的共享密钥目录
注意:需给共享密钥目录设置正确权限,确保所有应用进程(如www-data)有读写权限:
chown -R www-data:www-data /var/shared-auth-keys
3. 修复Apache反向代理的头信息传递
Apache反向代理必须正确转发Host和X-Forwarded-*头,否则ASP.NET Core会识别错误的域名,导致Cookie域不匹配。修改虚拟主机配置:
<VirtualHost *:443> ServerName app1.your-root-domain.com ProxyPreserveHost On ProxyPass / http://localhost:5000/ ProxyPassReverse / http://localhost:5000/ RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-Host "%{HTTP_HOST}s" # SSL相关配置省略 </VirtualHost>
同时在ASP.NET Core中启用转发头处理,在Startup.cs的ConfigureServices中添加:
services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost; options.KnownProxies.Add(IPAddress.Parse("127.0.0.1")); // 添加Apache服务器的IP地址 });
并在Configure方法最开头调用:
app.UseForwardedHeaders();
4. 验证Cookie属性有效性
登录后用浏览器开发者工具(Application -> Cookies)检查:
- Cookie的Domain是否为配置的根域(
.your-root-domain.com) - Secure属性是否为
true - SameSite属性是否为
None
若属性不符,逐一排查上述配置是否生效。
5. 统一所有子域应用的配置
所有需要实现SSO的子域应用,必须完全复用以上所有配置项,包括Cookie名称、域、数据保护参数、反向代理头配置。
内容的提问来源于stack exchange,提问作者Parvez Khan
相关产品推荐
相关产品推荐

