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

同域名下利用现有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"
  • 确保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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:31:37