Cookie Path 设置缺失导致的登录重定向循环问题
框架进化
2
帖子
1
发布者
35
浏览
1
关注中
-
Cookie Path 设置缺失导致的登录重定向循环问题
问题描述
在 staging 环境(
staging-admin.loda.online)下,有 3 个站点出现登录后的无限重定向循环:customer-order-web(虚拟目录:/orders)article-web(虚拟目录:/cms)basedata-web(虚拟目录:/basic)
循环路径:
/orders/default.aspx → /passport/Home/Login.aspx?ReturnUrl=.../orders/default.aspx → /orders/Home/Login.aspx?key=xxx&info=xxx&ReturnUrl=.../orders/default.aspx → /orders/default.aspx (再次认为未登录) → 循环...根本原因
1. Cookie Path 的浏览器行为规则 (RFC 6265)
当服务端设置 Cookie 时,如果没有显式指定
Path属性:- 浏览器会自动将 Cookie 的
Path设为当前请求 URL 的目录路径 - 例如:在
/orders/Home/Login.aspx设置 Cookie → Path 默认为/orders/Home/
浏览器发送 Cookie 的规则:
- 只有当请求路径是 Cookie Path 的前缀时,才会发送该 Cookie
/orders/Home/Default.aspx→ 会发送 (因为/orders/Home/Default.aspx以/orders/Home/开头)/orders/default.aspx→ 不会发送 (因为/orders/不以/orders/Home/开头)
2. 问题站点的特殊性
这 3 个站点的首页位置:
/orders/default.aspx ← 在虚拟目录根 /cms/default.aspx /basic/default.aspx登录页位置:
/orders/Home/Login.aspx ← 在 Home 子目录 /cms/Home/Login.aspx /basic/Home/Login.aspx3. 问题代码
修改前的代码(CookieHelper.cs 第 42-48 行):
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName); cookie.Value = FormsAuthentication.Encrypt(ticket); cookie.Expires = DateTime.Now.AddDays(1); cookie.HttpOnly = false; // ❌ 没有设置 Path,浏览器默认为当前目录 System.Web.HttpContext.Current.Response.Cookies.Add(cookie);4. 执行流程与失败点
步骤 URL Cookie Path Cookie 是否发送 结果 1 访问 /orders/default.aspx- 无 Cookie 302 跳转到 Passport 2 Passport 登录 - - 302 返回应用 3 /orders/Home/Login.aspx写入 Cookie - Cookie Path = /orders/Home/4 302 跳转到 /orders/default.aspx/orders/Home/
不发送认为未登录 5 再次 302 到 Passport - - 循环开始 修复方案
修改内容
只修改一行代码,在第 47 行添加:
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName); cookie.Value = FormsAuthentication.Encrypt(ticket); cookie.Expires = DateTime.Now.AddDays(1); cookie.HttpOnly = false; cookie.Path = "/"; // ✅ 显式设置为根路径 System.Web.HttpContext.Current.Response.Cookies.Add(cookie);修复后的行为
步骤 URL Cookie Path Cookie 是否发送 结果 1 访问 /orders/default.aspx- 无 Cookie 302 跳转到 Passport 2 Passport 登录 - - 302 返回应用 3 /orders/Home/Login.aspx写入 Cookie - Cookie Path = /4 302 跳转到 /orders/default.aspx/
发送识别登录状态 5 显示首页 - - 正常完成 
为什么只有这 3 个站点有问题?
对比分析:
问题站点:
- 登录页在子目录:
/orders/Home/Login.aspx - 首页在根目录:
/orders/default.aspx - 路径不匹配 → Cookie 无法送达
正常站点:
- 登录页在子目录:
/wms/Home/Login.aspx - 首页也在子目录:
/wms/Home/Default.aspx - 路径匹配 → Cookie 可以送达
验证方法
修复后,在浏览器 DevTools → Application → Cookies 查看:
修复前:
Name: YeeCustomerOrders2 Value: [encrypted] Domain: staging-admin.loda.online Path: /orders/Home/ ← 错误修复后:
Name: YeeCustomerOrders2 Value: [encrypted] Domain: staging-admin.loda.online Path: / ← 正确相关代码对比
同一个文件中的 SaveSid 方法(第 56-64 行)已经正确设置了 Path:
static public void SaveSid(Guid sid) { HttpCookie cookie = new HttpCookie("SID", sid.ToString()); cookie.Path = "/"; // ✅ 这里有设置 cookie.Expires = DateTime.Today.AddDays(1).AddHours(2); HttpContext.Current.Response.Cookies.Add(cookie); }而 StoreLocalCookie 方法之前缺少这一行,导致了不一致的行为。
影响范围
- 修改文件:Yee.Web.Security\CookieHelper.cs
- 影响站点:所有继承 LoginPage 基类的站点(25 个)
- 实际受益:
customer-order-web、article-web、basedata-web - 其他站点:无副作用(从默认行为改为显式设置,行为一致)
部署要求
- 重新编译
Yee.Web.Security.dll - 更新所有 UI 站点的依赖
- 重启 IIS 应用池清除旧 DLL 缓存
-
WindSurf的Claude Sonnect 4.5药到病除,一点弯路都没有。
<machineKey validationKey="..." decryptionKey="..." validation="SHA1" />虽然对 Cookie Path 没有直接影响,但如果 Passport 传来的 key/info 需要用特定的 machineKey 解密,可能会导致登录失败。
签入代码以后,老挝准正式站ERP后台,25个站点,全部再没有重定向循环的bug了。
