跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组
皮肤
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠

乐达

  1. 主页
  2. 技术路线图
  3. 框架进化
  4. Cookie Path 设置缺失导致的登录重定向循环问题

Cookie Path 设置缺失导致的登录重定向循环问题

已定时 已固定 已锁定 已移动 框架进化
2 帖子 1 发布者 35 浏览 1 关注中
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • Z 离线
    Z 离线
    zhongfangxiong
    写于 最后由 编辑
    #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.aspx
    

    3. 问题代码

    修改前的代码(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
    • 其他站点:无副作用(从默认行为改为显式设置,行为一致)

    部署要求

    1. 重新编译 Yee.Web.Security.dll
    2. 更新所有 UI 站点的依赖
    3. 重启 IIS 应用池清除旧 DLL 缓存
    1 条回复 最后回复
    0
    • Z 离线
      Z 离线
      zhongfangxiong
      写于 最后由 编辑
      #2

      WindSurf的Claude Sonnect 4.5药到病除,一点弯路都没有。

      <machineKey validationKey="..." decryptionKey="..." validation="SHA1" />
      

      虽然对 Cookie Path 没有直接影响,但如果 Passport 传来的 key/info 需要用特定的 machineKey 解密,可能会导致登录失败。

      签入代码以后,老挝准正式站ERP后台,25个站点,全部再没有重定向循环的bug了。

      7.png

      1 条回复 最后回复
      0
      回复
      • 在新帖中回复
      登录后回复
      • 从旧到新
      • 从新到旧
      • 最多赞同


      • 登录

      • 登录或注册以进行搜索。
      • 第一个帖子
        最后一个帖子
      0
      • 版块
      • 最新
      • 标签
      • 热门
      • 世界
      • 用户
      • 群组