同域名下利用现有Azure Redis缓存实现站点SSO的方案咨询
无需Identity Framework的同域子站点SSO方案(基于Azure Redis)
完全可以做到!不用折腾单独的认证服务器,靠着你现有的Azure Redis缓存,就能实现a.example.com和b.example.com之间的SSO,核心就是让两个应用共享会话存储和跨域Cookie。下面是具体的实现步骤和关键细节:
1. 让两个应用共享同一Azure Redis实例
这是实现SSO的基础,确保两个站点读写同一份会话数据:
- 给
b.example.com配置和a.example.com完全相同的Azure Redis连接字符串,指向同一个缓存实例。 - 确保两个应用的会话配置参数完全一致:包括会话ID生成算法、超时时间、序列化方式(比如ASP.NET Core里的会话序列化器)、甚至会话前缀(如果用了的话)。参数不匹配会导致两个站点无法识别彼此的会话。
2. 配置跨域Cookie共享
因为两个站点是同主域的子域名,浏览器允许共享主域级别的Cookie,这一步是关键:
- 设置Cookie的
Domain属性为.example.com(注意开头的点),这样所有example.com的子域名都能读取这个Cookie。- ASP.NET Core中:在
AddSession配置里指定options.Cookie.Domain = ".example.com" - 传统ASP.NET中:在web.config里设置
<httpCookies domain=".example.com" />,或代码里设置FormsAuthentication.CookieDomain = ".example.com"
- ASP.NET Core中:在
- 确保Cookie的
Path为/,覆盖整个域名路径;同时开启Secure属性(必须HTTPS站点),并将SameSite设为SameSiteMode.None(确保跨子域名请求能携带Cookie)。 - 两个应用要使用相同的会话Cookie名称,比如
.ExampleApp.Session,避免浏览器识别为不同Cookie。
3. 统一会话验证逻辑
两个站点要使用一致的会话读取/验证逻辑:
- 在
a.example.com登录时,将用户身份信息(比如用户ID、用户名)存入Redis会话(比如ASP.NET Core的HttpContext.Session.SetString("UserId", "xxx"))。 b.example.com在请求到达时,先读取Redis中的会话信息:如果存在有效会话且包含用户身份,就自动将用户标记为已登录,无需二次验证。- 登出时,要同时清除Redis中的会话记录和浏览器Cookie,确保两个站点同步登出。
关键注意事项
- 必须使用HTTPS:跨域Cookie在HTTP环境下会被浏览器拦截,且
SameSite.None要求Cookie必须是Secure类型。 - 强化Redis安全:Azure Redis要配置严格的访问密钥、虚拟网络隔离,避免会话数据泄露。
- 同步会话超时:两个站点的会话超时时间必须一致,避免一方会话过期另一方仍能访问。
ASP.NET Core配置示例
// Program.cs 配置Redis和会话 builder.Services.AddStackExchangeRedisCache(options => { options.Configuration = builder.Configuration.GetConnectionString("AzureRedis"); options.InstanceName = "SharedSession:"; // 可选,给会话加前缀隔离其他Redis数据 }); builder.Services.AddSession(options => { options.Cookie.Name = ".ExampleApp.Session"; options.Cookie.Domain = ".example.com"; options.Cookie.SameSite = SameSiteMode.None; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.IdleTimeout = TimeSpan.FromHours(2); // 和a.example.com保持一致 }); // 启用会话中间件(要放在UseRouting之后,UseAuthorization之前) app.UseSession();
这样配置后,用户在a.example.com登录后,访问b.example.com会自动读取到Redis中的会话信息,实现无感知的SSO,完全不需要单独部署认证服务器。
内容的提问来源于stack exchange,提问作者Mawy
相关产品推荐
相关产品推荐

