[ASP.NET Core 3.1]浏览器嗅探解决部分浏览器丢失Cookie问

今天的干货长驱直入,直奔主题

看了前文的同学们应该都知道,搜狗、360等浏览器在单点登录中反复重定向,最终失败报错。

原因在于,非Chrome80+浏览器不识别Cookie上的SameSite=none属性值,导致认证Cookie在后续请求中被抛弃。

截至2020/3/30号,非Chrome浏览器测试包含两种结果:

  • case1:可设置cookie的samesite=none, 浏览器可读取该cookie

  • case2:对cookie设置samesite=none, 浏览器不能读取该cookie

浏览器最新版本号结果备注
IE11case1win10
Edge44.18362.449.0case12020/2/15开始使用chrome内核/70.0.3538.102
Firefox74case1
360急速浏览器12.0.1190.0case1基于chromium78
搜狗浏览器8.6.1.31812case2User-Agent:Chrome/65.0.3314.0
猎豹安全浏览器6.5.115case2User-Agent:Chrome/57.0.2987.98
QQ浏览器10.5.3case1chromium 70
华为手机浏览器10.0.6.304case1
魅族手机浏览器8.5.1case2

嗯,我之前报的360急速浏览器在新版已经更新了Chrome内核,作为主流的搜狗和猎豹浏览器还是使用旧版本Chrome内核,这是要闹哪样?

如果Web应用程序打算支持旧内核浏览器,则需要实现浏览器嗅探。ASP.NET Core不会帮你实现浏览器嗅探,因为User-Agents值易变且经常更改。

但是Microsoft.AspNetCore.CookiePolicy中的扩展点允许插入浏览器嗅探逻辑。

在Startup.Configure中,在调用UseAuthentication或任何写入cookie的方法之前添加调用UseCookiePolicy的代码

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Error");app.UseHsts();}app.UseHttpsRedirection();app.UseStaticFiles();app.UseRouting();// 表示ASP.NET Core 启动Cookie策略app.UseCookiePolicy();app.UseAuthentication();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapRazorPages();});
}

在Startup.ConfigureServices, 添加Cookie的策略配置代码:

public void ConfigureServices(IServiceCollection services)
{services.Configure<CookiePolicyOptions>(options =>{options.MinimumSameSitePolicy = (SameSiteMode)(-1);options.OnAppendCookie = cookieContext =>CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);options.OnDeleteCookie = cookieContext =>CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);});services.AddRazorPages();
}private void CheckSameSite(HttpContext httpContext, CookieOptions options)
{if (options.SameSite == SameSiteMode.None){var userAgent = httpContext.Request.Headers["User-Agent"].ToString();if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent)){options.SameSite = SameSiteMode.Unspecified;}}
}

上面的例子中,MyUserAgentDetectionLib.DisallowsSameSiteNone 是一个自定义的库文件,侦测不支持SameSite=None的UserAgent。

ASP.NET Core3.1 对与SameSiteMode新增了一个 Unspecified枚举值,表示服务端不会对Cookie设置SameSite属性值, 后面的携带Cookie的事情交给浏览器默认配置。

具体的侦测代码如下:

public static bool DisallowsSameSiteNone(string userAgent)
{// Check if a null or empty string has been passed in, since this// will cause further interrogation of the useragent to fail.if (String.IsNullOrWhiteSpace(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;
}

总结

本文实战讲解在ASP.NET Core CookiePolicy扩展点插入浏览器嗅探逻辑,解决设备不支持cookie SameSite=none而导致的cookie丢失问题。

  • https://www.chromium.org/updates/same-site/incompatible-clients

推荐阅读

● 这么香的Chrome插件,你都安装了吗?

● 一文掌握Cookies前世今生

● ASP.NET Core跨平台技术内幕

● TPL Dataflow组件应对高并发,低延迟要求

● 实例解读Docker Swarm

● 基于docker-compose的Gitlab CI/CD实践&排坑指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言 最小值算法,C语言实现基于最大堆和最小堆的堆排序算法示例

堆定义堆实际上是一棵完全二叉树&#xff0c;其任何一非叶节点满足性质&#xff1a;Key[i]<key[2i1]&&Key[i]<key[2i2](小顶堆)或者&#xff1a;Key[i]>Key[2i1]&&key>key[2i2](大顶堆)即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关…

LeetCode100 相同的树-简单

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true 示例 2&a…

Xamarin.Forms读取并展示Android和iOS通讯录 - TerminalMACS客户端

本文同步更新地址&#xff1a;https://dotnet9.com/11520.htmlhttps://terminalmacs.com/861.html阅读导航&#xff1a;一、功能说明二、代码实现三、源码获取四、参考资料五、后面计划一、功能说明完整思维导图&#xff1a;https://github.com/dotnet9/TerminalMACS/blob/mast…

LeetCode 101对称二叉树-简单

给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1/ \2 2/ \ / \ 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1/ \2 2\ \3 3代码如下&#xff1a; /*** Definition for a binary tree…

paragon+ntfs+linux,NTFS For Mac 超强兼容性

NTFS For Mac是为解决Windows和Mac OS X不兼容问题而开发的低级别档案系统驱动&#xff0c;提供在Mac OS X下完全读/写访问NTFS档案系统的任何版本。兼容mac OS X所有版本、32/64位内核模式&#xff0c;及其它第三方软件。不仅如此&#xff0c;NTFS For Mac 超强兼容性支持更多…

Asp.Net Core Ocelot Consul 微服务

做一个简单的微服务架构如下图&#xff1a;这个图表示的是一个网关代理Consul的两个服务&#xff0c;consul每个服务注册集群安装 Consul的服务&#xff0c;这里安装单机版的&#xff0c;集群版配置最低要求&#xff08;3个Consul server&#xff09;的需要三台虚拟机&#xff…

LeetCode 104二叉树的最大深度-简单

给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 3/ \9 20/ \15 7返回它的最大深度 3 。 代码如下: …

以下c语言程序片段用于估测cpu的cache参数,阿里巴巴笔试题

阿里巴巴笔试题1.平均速度最快的排序算法是______。Shell排序快速排序冒泡排序插入排序2014-03-29 18:36:022.某服务进程的QPS(没秒处理的请求个数)较低&#xff0c;在空闲时间RT(响应时间)比较合理。在压力下CPU占用率20%左右。那么可能存在的问题是______。该进程的某个处理过…

.Neter们,你真的应该了解下EFCore3.x

本期导读&#xff1a;技术文&#xff0c;带你了解关于EntityFrameworkCore3.x的那些事&#xff0c;本文共1493个字&#xff0c;阅读大约需要3分钟。文末福利不要错过哦&#xff01;是的各位.Neter&#xff0c;不用怀疑&#xff0c;使用O/RM的开发者越来越多了&#xff0c;从风起…

LeetCode 111二叉树的最小深度-简单

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2 示例 2&#xff1a; 输…

山东省中职信息技术c语言试题及答案,中职计算机专业C语言测试题

高三计算机专业C语言测试题(1)学号姓名&#xff1a;得分&#xff1a;一、选择题40’1、下列选项是C语言保留字的一项是()A DOB gosubC strutD CHAR2、下列选项中可以作为C语言用户标识符的一组是()A void , define, wordB a3_b3, _123, IFC for, _abc , caseD 2a, do, sizeof3、…

istio回归「单体应用」对我们的启发

大家好&#xff0c;我是Z哥。这次分享给大家的是一篇与技术相关的文章&#xff0c;但是我想表达的核心观点并不仅限于技术范围。我们中国有句古话&#xff0c;分久必合&#xff0c;合久必分。很多事物的发展都逃不开这个规律。如今&#xff0c;这件事也正在分布式、微服务概念大…

LeetCode 110平衡二叉树-简单

给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;t…

c语言中如何使用面向对象编程,如何使用C语言的面向对象

我们都知道&#xff0c;C才是面向对象的语言&#xff0c;但是C语言是否能使用面向对象的功能&#xff1f;(1)继承性typedef struct _parent{int data_parent;}Parent;typedef struct _Child{struct _parent parent;int data_child;}Child;在设计C语言继承性的时候&#xff0c;我…

c语言开发环境 推荐,C语言复习和VC++6.0开发环境推荐.ppt

C语言复习和VC6.0开发环境推荐* * * * * * * * * F10-单步调试 F11-进入函数内部调试 ShiftF11-从函数内部回到调用函数(如main) CtrlF10-运行到光标处. ShiftF5-终止调试过程. * 是一个重要概念&#xff0c;可以有效地表示复杂的数据结构&#xff1b; 能动态分配内存&#xff…

LeetCode 112路径总和-简单

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum &#xff0c;判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,…

ASP.NET MVC升级到ASP.NET Core MVC踩坑小结

写在前面ASP.NET Core是微软新推出的支持跨平台、高性能、开源的开发框架&#xff0c;它的优势不必多说&#xff0c;因为已经说得太多了。当然&#xff0c;现在依然有着数量庞大的系统运行于.NET Framework上&#xff0c;由于有大量的Break Changes&#xff0c;很多项目项目团队…

用函数求C15的值C语言,南开19春学期(1503、1509、1603、1609、1703)《C语言程序设计》在线作业-1辅导资料.docx...

南开19春学期(1503、1509、1603、1609、1703)《C语言程序设计》在线作业-1辅导资料.docx 南开19春学期(1503、1509、1603、1609、1703)C语言程序设计在线作业-11、D 2、B 3、C 4、A 5、D 一、单选题共40题&#xff0c;80分1、以下对一维整型数组 a 的正确说明是 Aint a10 ;Bint…

LeetCode 563二叉树的坡度-简单

给定一个二叉树&#xff0c;计算 整个树 的坡度 。 一个树的 节点的坡度 定义即为&#xff0c;该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话&#xff0c;左子树的节点之和为 0 &#xff1b;没有右子树的话也是一样。空结点的坡度是 0 。 整个树…