部分浏览器 set-cookie 不成功踩坑记录

Posted kdcg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部分浏览器 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浏览器截图:

技术图片

 

以上是关于部分浏览器 set-cookie 不成功踩坑记录的主要内容,如果未能解决你的问题,请参考以下文章

pycocotools踩坑记

quartz定时任务中日志切面踩坑实录

quartz定时任务中日志切面踩坑实录

Exceptionless 本地部署踩坑记录

Flutter image_picker踩坑记录

Datawale打卡,Docker踩坑记录