一、关于SameSite的介绍

1.  什么是SameSite?

SameSite是浏览器请求中Set-Cookie响应头新增的一种属性,它用来标明这个 cookie 是否是“同站 cookie”,同站 cookie 只能在本域名中使用的cookie,不能作为第三方 cookie。

Chrome 51 开始,浏览器的 Cookie 新增加了一个SameSite属性,用来防止 CSRF 攻击和用户追踪。该属性起初是由Google 起草的一份草案用来来改进 HTTP 协议的。

2. 为什么要用SameSite?

用来防止 CSRF 攻击和用户追踪。Cookie 往往用来存储用户的身份信息,恶意网站可以设法伪造带有正确 Cookie 的 HTTP 请求,这就是 CSRF 攻击。

3. 在.Net Core3.1中如何使用SameSite?

用户想要在.Net Core3.1中使用该属性(以SameSite=None为例),则应在Startup.cs中配置以下代码:

services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.None;
});

二、使用SameSite时的具体使用

在.Net Core3.1中使用SameSite属性应注意以下几点:

(1)Strict 最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie

(2) Lax规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外

(3)Chrome 计划将Lax变为默认设置。这时,网站可以选择显式关闭SameSite属性,将其设为None (对旧版浏览器无效,因为旧版浏览器没有该值。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。

 下面的设置无效

Set-Cookie: widget_session=abc123; SameSite=None
//浏览器警告提示

   下面的设置有效

Set-Cookie: widget_session=abc123; SameSite=None; Secure

 (4)Unspecified表示不指定SameSite属性。这意味着,浏览器不会将 SameSite 属性添加到Set-Cookie中并且客户端将使用其默认行为 (对旧版浏览器无效,因为旧版浏览器没有该值) 。

(5)设置Secure属性,该属性在SameSite=None的场景下使用(以SameAsRequest为例)

services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
options.Secure = CookieSecurePolicy.SameAsRequest;
});

该属性配置的枚举值有以下几个:

    SameAsRequest:如果提供 cookie 的 URI 是 HTTPS,则 cookie 仅会在后续的 HTTPS 请求上返回到服务器。 否则,如果提供 cookie 的 URI 为 HTTP,则 cookie 将在所有 HTTP 和 HTTPS 请求上返回到服务器。 此值可确保已部署服务器上的所有经过身份验证的请求使用 HTTPS,还支持将 HTTP 用于本地主机开发和不支持 HTTPS 的服务器。

    Always:Secure 始终标记为 true。 当登录页以及需要身份验证标识的所有后续页是 HTTPS 时,请使用此值。 本地开发也需要使用 HTTPS URL 来完成。

    None:Secure 未标记为 true。 当登录页为 HTTPS,但站点上的其他 HTTP 页也需要身份验证信息时,请使用此值。 不建议使用此设置,因为本地网络或无线连接中的其他计算机可能会观察到并使用随 HTTP 请求提供的身份验证信息。

 

三、遇到的问题

按照SameSite=None的解释,一是这表示允许Cookie的使用,二是必须配合Secure的设置。

那么当配置Secure的时候,按照文档的解释,配置为CookieSecurePolicy.SameAsRequest时,无论是https还是http的场景下,用户登录应该都是没有问题的(因为用户登录信息存在cookie中了)

但实际上以上我的配置并不生效,浏览器总是提示

说明没有标记secure成功(此时浏览器用不了cookie,系统总是会跳到登录页面)!

我也查了一下资料,说是这种情况Cookie 只能通过 HTTPS 协议发送,我也确实是证实了在https下是可以正常登录的。

具体是什么原因,我也不知道,也可能就是规定这么用,这里有待大神指点!!!

四、解决办法

1. 把SameSite设置为了Unspecified,此时浏览器不存在SameSite属性,就不会出现cookie的任何问题。

2. 把域名搞成https,然后SameSite=None配合Secure=SameAsRequest使用,也可以正常使用cookie

本人小白,大神勿喷!

.Net Core3.1中SameSite的使用方法、遇到的问题以及解决办法的更多相关文章

  1. AFNetworking 3.0中调用[AFHTTPSessionManager manager]方法导致内存泄漏的解决办法

    在使用AFNetworking3.0框架,使用Instruments检查Leaks时,检测到1000多个内存泄漏的地方,定位到 [AFHTTPSessionManager manager] 语句中,几 ...

  2. IntelliJ IDEA的jsp中内置对象方法无法被解析的解决办法

    主要原因是因为缺乏依赖 可以通过添加依赖的方式 导入servlet-api.jar,jsp-api.jar,tomcat-api.jar 这三个jar即可 这三个jar在tomcat的lib目录下有 ...

  3. Visual studio 2017中 Javascript对于Xrm对象模型没有智能提示的解决办法

    Visual studio 2017中 Javascript对于Xrm对象模型没有智能提示的解决办法 先上个图.语法提示支持到 Microsoft Dynamics xRM API 8.2 也就是cr ...

  4. es6 Object.assign ECMAScript 6 笔记(六) ECMAScript 6 笔记(一) react入门——慕课网笔记 jquery中动态新增的元素节点无法触发事件解决办法 响应式图像 弹窗细节 微信浏览器——返回操作 Float 的那些事 Flex布局 HTML5 data-* 自定义属性 参数传递的四种形式

    es6 Object.assign   目录 一.基本用法 二.用途 1. 为对象添加属性 2. 为对象添加方法 3. 克隆对象 4. 合并多个对象 5. 为属性指定默认值 三.浏览器支持 ES6 O ...

  5. Eclipse中js文件修改后浏览器不能及时更新的解决办法

    项目中js文件修改后浏览器不能及时更新的解决办法 转载:http://www.codeweblog.com/%E9%A1%B9%E7%9B%AE%E4%B8%ADjs%E6%96%87%E4%BB%B ...

  6. Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法

    Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法 如下面所示,同时导入这两个,会提示其中一个与另一个产生冲突. 1i ...

  7. .NET在IE9中页面间URL传递中文变成乱码的解决办法

     在.Net的项目中,鼠标点击查询按钮,转到查询页面,但URL中包含中文时,传到服务器端后,中文变成了乱码(只有IE9出现该问题).       尝试使用Server.UrlEncode()进行编码, ...

  8. electron-vue中使用iview 报错this. is readonly的解决办法

    title: electron-vue中使用iview 报错this. is readonly的解决办法 toc: false date: 2019-02-12 19:33:28 categories ...

  9. (tamcat控制台乱码)在idea中运行toncat后控制台出现乱码的情况解决办法(教程附图)。

    详细教程: (tamcat控制台乱码)在idea中运行toncat后控制台出现乱码的情况解决办法(教程附图)._IT打工酱的博客-CSDN博客

随机推荐

  1. 如何使用 js 实现相似图片搜索

    如何使用 js 实现相似图片搜索 以图搜图 https://www.google.com/imghp?hl=en https://www.google.com/imghp?hl=zh https:// ...

  2. React Component All In One

    React Component All In One https://reactjs.org/docs/react-api.html#components React Class Component ...

  3. Web SQL& IndexedDB

    Web SQL& IndexedDB https://developer.mozilla.org/en/docs/Web/API/IndexedDB_API https://mdn.githu ...

  4. py django

    创建项目 $ django-admin startproject server 运行项目 $ cd server $ python manage.py runserver 创建一个模块 $ pytho ...

  5. js 如何取消promise

    1: 使用reject function hello() { let _res, _rej: any; const promise = new Promise((res, rej) => { _ ...

  6. subline3 如何设置es6高亮

    步骤: 1.操作Ctrl+Shift+P , 然后在弹出的框内输入Package Control: in,2.选择Package Control: install package,3.等待再次弹出输入 ...

  7. BGV劝早买内存

    12月3日,BGV全球首发,上线AOFEX交易所(A网),全球区块链爱好者震惊.很多人争相抢挖BGV,希望能够及早获取BGV带来的红利.有趣的是,随着BGV抢挖人数的增多,NGK内存也迎来了暴涨,在1 ...

  8. [转]百度Appollo无人车Perception Module 分析

    https://github.com/ApolloAuto/apollo/blob/master/docs/howto/modules/apollo1.5_perception_module_stud ...

  9. Python3网络爬虫-- 使用代理,轮换使用各种IP访问

    # proxy_list 代理列表 run_times = 100000 for i in range(run_times): for item in proxy_list: proxies = { ...

  10. 页面导入导出EXCEL

    引用 using Microsoft.Office.Interop.Excel;using System.Reflection;//反射命名空间using System.IO; protected v ...