beanutils.copyproperties属性值丢失_[ASP.NET Core 3.1]浏览器嗅探解决部分浏览器丢失Cookie问...

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

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

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

截至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(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实践&排坑指南

6c8c21ca4762d52e9266f82f9e9d2a74.png

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

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

相关文章

JAVA入门级教学之(final关键字)

不希望任何人可以随意修改自己的东西的时候可以用final关键字进行修饰 * 1.final是一个关键字,表示最终的,不可变的 * * 2.final修饰的类无法被继承 * * 3.final修饰的方法无法被覆盖 * * 4.final修饰的变量一旦被赋值后,不可重新赋…

fopen吃内存吗 php,file_get_contents = PHP致命错误:允许的内存耗尽

我没有处理大文件的经验,所以我不确定该怎么办。我试图使用 file_get_contents 读取几个大文件;任务是使用preg_replace() 清洁和修补它们。我的代码在小文件上运行良好;但是,大文件(40 MB)触发内存耗尽错误:PHP Fatal…

倒计时小工具_这款高颜值的 APP 可以让小仙女/男神们的日子过得更精致

倒计时是大家平常都会用的功能,系统自带的工具或许也能满足一部分朋友的需求,但是对于生活精致,并且富有仪式感的小仙女和小男神们,一款普普通通的计时工具怎么能满足呢?今天推荐的这款应用——小时刻( App Store 搜索…

oracle 删除系统用户,Oracle数据库如何创建和删除用户

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1. 创建用户:SQL> create user user01 identified by user01;User created.但登录提示01045的错误,缺少CREATE SESSION权限。ERROR:ORA-01045: user USER01 lacks CREATE SESSION privilege; logon denie…

asp单元格合并后宽度没有合并_宅在家里跟着大牛从零开始学excel第五课-合并,边框,列宽行高...

接着上一课,我们制作的课程表,有人说了不好看,确实,我们就来补充和美化一下。首先我们要更改的就是字体,字体改成下图,字体大小选为18,样子就好看了很多了。仔细看上图,还却一点东西…

JAVA入门级教学之(package和import)

目录 JAVA入门级教学之(package和import) 1.包又称为package 2.怎么定义package? 3.包名的命名规范: 4.包名要求全部小写,包名也是标识符,必须遵守标识符的命名规范 5.一个包对应一个目录 6.使用了pa…

oracle数据库中分析函数大全,Oracle数据库的分析函数

over 连续的相加求各部门的薪水总和和全部总和 select name, salary, empsum(salary) over (order by emp) 连续求和sum(salary) over () 总和100*round(sal/sum(sal) over(), 5) 份额from company;sum() sum over() 求的是总和,sum over (order by ) 求的是连续的…

excel合并多个工作表_多个工作表或者多个工作簿的合并计算

哈喽,everybody,作为一个与excel打交道长达六年的职业老手,我会整理汇总一些十分有利于提高工作效率的小tip。也当作是我为自己知识点做的些许总结吧。今天我们就来聊聊如何快速合并多个工作表或者工作簿的这些事。话不多说,直接上…

JAVA入门级教学之(访问修饰符权限控制)

访问控制权限修饰符: 1.访问控制权限修饰符来控制元素的访问范围 public表示公开的,在任何位置都可以访问protected同包、本类、子类(出了包如果是子类没问题)缺省同包、本类(不能出包)private仅…

access字段属性设置下拉列表_CAD常用命令:ATTDEF(定义属性)

下面是本公众号文章分类目录,点击标题文字可打开分类文章列表:安装卸载 异常、退出 文件及输入输出 基本操作技巧 各种设置及相关问题 界面和显示相关问题 快捷键 视图设置和调整 图层 颜色 线型 字体、文字样式和文字输入 标注、引线和标注…

oracle定义转储目录,Oracle 12.1新特性:在线rename或relocate数据文件

在Oracle12.1之前的版本中要重命名数据文件或移动数据文件需要关闭数据库或把表空间/数据文件置为offline状态才可以,参考之前总结的要实现这一功能需要使用ALTERDATABASEMOVEDATAFILE语句,语法如下ALTER DATABASE MOVE DATAFILE ( filename | ASM_filen…

JAVA入门级教学之(super关键字)

目录 JAVA入门级教学之(super关键字) 1.super关键字用在构造方法中: 2.语法规则: 3.注意:super();的调用只能放在构造方法的第一行,和this();的调用规则一样 4.通过子类的构造方法去调用父类的构造方法…

lwip协议栈在linux运行,LwIP协议栈在uCOS II下的实现

1、概述:LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件、OS、编译器相关的部份独立出来,放在ucosii&LwIPsource etlwiparch目录下。因此LwIP在uCOS II上的实现就是修改这个目录下的文件,其它的文件一般不应该…

linux离线安装redmine_Feem:免流量跨平台文件传输工具,支持离线分享

Feem 是一款在文件传输领域打拼多年的产品,目前是基于 Wifi 局域网直连模式的文件传输服务,跨平台,在 Mac、PC、iOS、Android、Linux 皆有客户端。安装不同平台的客户端设备只要在同一无线网络,可以实现无提前配置式的自动配对&am…

JAVA入门级教学之(abstract抽象类)

目录 JAVA入门级教学之(abstract抽象类) 1.如何定义抽象类? 2.抽象类无法被实例化 3.虽然抽象类没有办法实例化,但是抽象类也有构造方法,该构造方法是给子类创建对象用的 4.抽象类中可以定义抽象方法 5.如果一个类…

linux 内核裁剪不当 死机,Linux編譯x86架構內核出現_stack_chk_guard未定義錯誤

背景android模擬器運行於virtualbox中,而virtualbox運行於x86架構的pc端,所以android及其Linux內核都編譯成x86架構。當virtualbox的vt未開啟的情況下android系統會出現各種問題,如arm庫游戲不能運行,桌面平凡掛死重啟。通過查看日…

a*算法流程图_光伏逆变器MPPT基本算法介绍李星硕

欢迎加入技术交流QQ群(2000人):电力电子技术与新能源 905723370高可靠新能源行业顶尖自媒体在这里有电力电子、新能源干货、行业发展趋势分析、最新产品介绍、众多技术达人与您分享经验,欢迎关注我们,搜索微信公众号:电力电子技术…

JAVA入门级教学之(接口)

目录 JAVA入门级教学之(接口) 接口也是一种引用类型,可以等同看做类 1.如何定义接口,语法: 2.接口中只能出现: 3.接口其实是一个特殊的抽象类,特殊在接口是完全抽象的 4.接口中没有构造方…

java 线程状态_浅析Java中的线程状态

一、线程的5种状态众所周知,Java的线程状态有5种,分别对应上图中五种不同颜色,下面对这5种状态及状态间的转化做相应的解释: 1. 初始化状态:新建一个线程对象 2. 可运行状态:其他线程调用了该线程对象的sta…

Linux7添加syslog,请教linux下安装syslog的方法.是安装,不是配置

、安装JDK从sun网站上直接下载JDK:http://java.sun.com/j2se/1.4.2/download.html 提供了两个下载:1、RPM in self-extracting file (j2sdk-1_4_2_04-linux-i586.bin, 32.77 MB) 这个是自解压的文件,在linux上安装如下:# chmod ux…