zoukankan      html  css  js  c++  java
  • 部分浏览器 set-cookie 不成功踩坑记录

    事件起因:

    公司正在做一个sso的单点登录的项目,做完之后,在测试阶段,不同的终端的兼容测试时候,好几个不同的浏览器出现了不同的问题,有登录之后自动退出,有登陆不成功等问题。

    在 pc 端只有 uc 浏览器不成功,移动端有 safari、360浏览器、qq浏览器、uc浏览器等。

    结果排查:

    后面具体查询,发现是由于后端在请求响应头设置 set-cookie 来处理 cookie 数据没有生效。由于数据没有正常写入 cookie 中,导致了上面各浏览器登录不成功的问题。

    问题解决:

    而最终引发问题的原因是 set-cookie 中的 samesite 的兼容性引起的。

    http://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html  阮一峰老师对于 samesite 的介绍。

    samesite 的出现是为了解决 CSRF 攻击和用户追踪。

    后面又查到了这篇文章:https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/

    上面详细介绍了 samesite 的前世今生及经测试过非规范的浏览器兼容列表以及处理方案:

    public static bool DisallowsSameSiteNone(string userAgent)
    {
        if (string.IsNullOrEmpty(userAgent))
        {
            return false;
        }
    
        // Cover all iOS based browsers here. This includes:
        // - Safari on iOS 12 for iPhone, iPod Touch, iPad
        // - WkWebview on iOS 12 for iPhone, iPod Touch, iPad
        // - Chrome on iOS 12 for iPhone, iPod Touch, iPad
        // All of which are broken by SameSite=None, because they use the iOS networking stack
        if (userAgent.Contains("CPU iPhone OS 12") || userAgent.Contains("iPad; CPU OS 12"))
        {
            return true;
        }
    
        // Cover Mac OS X based browsers that use the Mac OS networking stack. This includes:
        // - Safari on Mac OS X.
        // This does not include:
        // - Chrome on Mac OS X
        // Because they do not use the Mac OS networking stack.
        if (userAgent.Contains("Macintosh; Intel Mac OS X 10_14") && 
            userAgent.Contains("Version/") && userAgent.Contains("Safari"))
        {
            return true;
        }
    
        // Cover Chrome 50-69, because some versions are broken by SameSite=None, 
        // and none in this range require it.
        // Note: this covers some pre-Chromium Edge versions, 
        // but pre-Chromium Edge does not require SameSite=None.
        if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6"))
        {
            return true;
        }
    
        return false;
    }

    处理方法:

    if (options.SameSite == SameSiteMode.None) {
      var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
      // TODO: Use your User Agent library of choice here.
      if (DisallowsSameSiteNone(userAgent)) { 
       // For .NET Core < 3.1 set SameSite = (SameSiteMode)(-1)
       options.SameSite = SameSiteMode.Unspecified;
     }
    }

    在不能识别 samesite 新值的,浏览器版本中,set-cookie 中的 samesite 值设为 -1,在前端请求头中,将发现 set-cookie 的值中已没有了samesite 配置。

    UC浏览器截图:

     chrome浏览器截图:

  • 相关阅读:
    event.preventDefault() 火狐下没有作用。
    输入框禁止键盘输入数字意外的字符
    js遍历数组重复值和数组中对象重复值
    js获取30、X天前得时间
    docker 命令详解
    右键禁止浏览器自带的右键
    Kncokout之绑定事件三
    转:Maven的默认中央仓库以及修改默认仓库&配置第三方jar包从私服下载
    异常: java.security.InvalidKeyException: Illegal key size
    转:Java并发编程:深入剖析ThreadLocal
  • 原文地址:https://www.cnblogs.com/kdcg/p/13403181.html
Copyright © 2011-2022 走看看