临近年关,咨询师提出360、搜狗急速浏览器无法单点登录到公司核心产品WD: 重定向过多。

现象

经过测试, 出现单点登陆故障的是搜狗、360等双核浏览器(默认使用Chrome内核), 较新式的Edge、Chrome、Firefox均未出现此障碍。

Developer tool监测不到原始的SSO请求,互联网上同类型问题不少,答案却惨不忍睹,味同嚼蜡,人云亦云。年末不能晚节不保,决心啃下硬骨头.

拿出网络分析利器Fiddler

循环重定向?

显示单点登录从website1?ticket =XXOO重定向回首页website.com,确实发生了循环重定向,搜狗浏览器有重定向次数限制,最终返回浏览器定制的404 页面。

结合之前手撕公司单点登录原理:

探究站点发生循环重定向的原因:

自⑥ website1向浏览器写入Cookie for website1,重定向请求站点主页www.website1.com⑦的时候,丢失Cookie for website1,导致website1认为用户未登陆,被迫重定向请求sso-website.com?service=http://www.website1.com②重新认证;

sso-website.com站点检测到存在Cookie for sso(该用户已经认证),又开始走④⑤⑥⑦步骤,在第⑦步依旧未携带Cookie for website1,又再次重定向请求sso-website.com?service=http://www.website1.com②,循环往复。

定位问题

熟稔web开发的都知道 Cookie for website1 会在请求 website1.com时自然携带

Set-Cookie: X-Gridsum-FullTicketId=TGT-178876-em4uf0faD1c4pbt*********k5Z0vN4uPOoEBWfGIP6l-x-gridsumdissector; path=/; samesite=none; httponly

故障关键在单点登录最后一步重定向,竟然未携带Cookie for website1

截图:

着重分析写入Cookie for website1的附加属性:

Path 指示需要发送该cookie头的根url,      =/ 表示站点下所有地址都会发送该Cookie
SameSite 设置该Cookie的同源策略,     = none 指示客户端禁用Cookie的同源限制
HttpOnly 指示创建的Cookie是否能通过Javascript访问(该cookie依然存于浏览器上),这里true,表示不能通过Javascript访问该Cookie

从属性定义看,属性值的写法也无懈可击。

最后在官方站点找到如下内容:

The SameSite = None parameter causes compatibility problems with clients that implemented the prior 2016 draft standard (for example, iOS 12). See Supporting older browsers in this document; Apps accessed from older browsers which support the 2016 SameSite standard may break when they get a SameSite property with a value of None. Web apps must implement browser detection if they intend to support older browsers
遵守IETF 2016草案的浏览器不认识Samesite= None属性值,会遇到兼容性问题,若站点打算支持这些旧内核浏览器须实现浏览器嗅探。

这个信息让我眼前一亮,赶紧对比故障的浏览器内核:

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0

搜狗浏览器Chrome内核版本65,位列不兼容列表,binggo, 问题定位。

修复策略

我们的目的是为兼容这些旧核心浏览器,但是本人不打算打补丁(浏览器嗅探,根据User-Agent屏蔽SameSite=none),
结合站点的同源限制的现状,本站点没有必要显式设置SameSite= None,可保持SameSite默认值Lax
说干就干,修改SameSite属性值为Lax,重新k8s部署之后,搜狗浏览器正常单点登陆。

context.Response.Cookies.Append(_options.SsoTgtName, tgt1, new Microsoft.AspNetCore.Http.CookieOptions{HttpOnly = true,SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Lax,Secure = false,});

SameSite历史和版本变更

ASP.NET Core是在2.0版本开始支持SameSite(IETF 2016草案),ASP.NET Core默认将Cookie SameSite设为Lax, 遇到身份验证问题后,大多数SameSite使用被禁用。
IETF 2019标准发布了修复补丁,2019 SameSite草案规定:

  • 与2016年草案不向后兼容

  • 默认将Cookie SameSite= Lax

  • 显式设置SameSite=None时,必须将该Cookie标记为Secure, None是一个新值

  • ASP.NET Core 3.1在SameSite枚举值新增Unspecified,表示不写入SameSite属性值,继承浏览器默认的Cookie策略

  • 预定于2020年2月由Chrome默认启用该草案,浏览器需要迁移至该草案。

综上,SameSite=None引出了一个难缠的浏览器新旧版本兼容问题,就本站而言, Cookie的同源策略SameSite=Lax是可行的,是能够适应大多数单点登录。

[1] https://docs.microsoft.com/en-us/aspnet/core/security/samesite?view=aspnetcore-2.1
[2] https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core

往期精彩回顾

手撕公司单点登录原理

ASP.NETCore跨平台技术内幕

ASP.NETCore结合Redis实践消息队列

转载是一种动力,分享是一种美德    ~~..~~

如果你觉得文章还不赖,您的鼓励是原创干货作者的最大动力,让我们一起激浊扬清。

临近年关,修复ASP.NET Core因浏览器内核版本引发的单点登录故障相关推荐

  1. Android 应用(5)——android10.0升级webview浏览器内核版本

    参考链接: https://www.jianshu.com/p/a673718ef80a https://www.freesion.com/article/7856574309/ webview资源链 ...

  2. php 浏览器内核检测,php获取浏览器内核版本

    php获取浏览器内核版本<?php function getBrowser(){ $agent=$_SERVER["HTTP_USER_AGENT"]; if(strpos( ...

  3. asp.net core合并压缩资源文件引发的学习之旅

    0. 在asp.net core中使用BuildBundlerMinifier合并压缩资源文件 在asp.net mvc中可以使用Bundle来压缩合并css,js 不知道的见:http://www. ...

  4. .net core 1.0 实现负载多服务器单点登录

    前言 .net core 出来有一时间了,这段时间也一直在做技术准备,目前想做一个单点登录(SSO)系统,在这之前用.net时我用习惯了machineKey ,也顺手在.net core 中尝试了一上 ...

  5. SpringCloud工作笔记072---同一浏览器上不同标签页_tab页或者同一浏览器新开一个浏览器窗口也能实现单点登录_单点登录_localStorage_sessionStorage

    JAVA技术交流QQ群:170933152 注意用localStorage,存的token不会失效,可以在关闭浏览器的时候,清除或者设置一下过期时间,怎么做可以百度 注意:sessionStorage ...

  6. ASP.NET Core的身份认证框架IdentityServer4--(5)自定义用户登录(通过接口登录,无UI版本)...

    官网接口详解文档地址:文档地址 (PS:可通过接口名称搜索相应接口信息.) 源码地址:https://github.com/YANGKANG01/IdentityServer4-IdentityAut ...

  7. 实战解读ASP.NET Core身份认证

    长话短说:上文我们聊了 ASP.NET Core 基于声明的访问控制到底是什么鬼? 今天我们乘胜追击:聊一聊ASP.NET Core 中的身份验证. 身份验证是确定用户身份的过程.授权是确定用户是否有 ...

  8. ASP.NET Core 基于声明的访问控制到底是什么鬼?

    从ASP.NET 4.x到ASP.NET Core,内置身份验证已从基于角色的访问控制(RBAC)转变为基于声明的访问控制(CBAC). 我们常用的HttpContext.User属性ASP.NET ...

  9. .ASP NET Core中缓存问题案例

    本篇博客中,我将描述一个关于会话状态(Session State)的问题, 这个问题我已经被询问了好几次了. 问题的场景 创建一个新的ASP.NET Core应用程序 一个用户在会话状态中设置了一个字 ...

最新文章

  1. 批处理实现从Excel导入Oracle
  2. R语言实战第一,二章SQL版
  3. python实现第一个web_我的第一个python web开发框架(6)——第一个Hello World
  4. CNCF 宣布 TUF 毕业 | 云原生生态周报 Vol. 33
  5. 音视频技术开发周刊(第130期)
  6. Persistent Memory编程简介
  7. html一个页面分页代码怎么写,纯JS前端实现分页代码
  8. markdown与latex:如何写出具有数学符号意味的ln3\ln
  9. Vue.js 的开始!
  10. apt-get 很有用的一个命令
  11. TotalFinder for Mac(Finder增强工具)
  12. 论文笔记_S2D.07-2017-CVPR-RefineNet: 用于高分辨率语义分割的多路径精细网络
  13. vector迭代器的使用
  14. SQLAlchemy数据库映射和使用
  15. 品质管控计划ppt怎样写_供应商质量管理工作计划.ppt
  16. ANSYS FLUENT——最基本操作(以一个简单的案例为例)
  17. Android8.0 USB系统框架
  18. 计算机硬件的配置的图片,鲁大师怎么生成电脑配置图
  19. 多说最近访客通用代码使用方法
  20. P3258[JLOI2014]松鼠的新家(LCA 树上差分)

热门文章

  1. 找最大重复次数的数和重复次数(C++ Pair)
  2. hdu 1460 完数
  3. 如何衡量两个词的相关度
  4. 大学生计算机课程考试试题,大学生计算机基础课程考试系统研究与实现
  5. java 连接kafka_设置多个kafka连接接收器
  6. Unity中Time.deltaTime的含义及其应用
  7. div 包裹_如何查看到达之前收到的包裹和邮件
  8. Rsa2加密报错java.security.spec.InvalidKeySpecException的解决办法
  9. 看明星合影争C位,学PPT中C位排版法
  10. Git命令集十三——快照操作