.Net Core3.1中SameSite的使用方法、遇到的问题以及解决办法
一、关于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的使用方法、遇到的问题以及解决办法的更多相关文章
- AFNetworking 3.0中调用[AFHTTPSessionManager manager]方法导致内存泄漏的解决办法
在使用AFNetworking3.0框架,使用Instruments检查Leaks时,检测到1000多个内存泄漏的地方,定位到 [AFHTTPSessionManager manager] 语句中,几 ...
- IntelliJ IDEA的jsp中内置对象方法无法被解析的解决办法
主要原因是因为缺乏依赖 可以通过添加依赖的方式 导入servlet-api.jar,jsp-api.jar,tomcat-api.jar 这三个jar即可 这三个jar在tomcat的lib目录下有 ...
- Visual studio 2017中 Javascript对于Xrm对象模型没有智能提示的解决办法
Visual studio 2017中 Javascript对于Xrm对象模型没有智能提示的解决办法 先上个图.语法提示支持到 Microsoft Dynamics xRM API 8.2 也就是cr ...
- es6 Object.assign ECMAScript 6 笔记(六) ECMAScript 6 笔记(一) react入门——慕课网笔记 jquery中动态新增的元素节点无法触发事件解决办法 响应式图像 弹窗细节 微信浏览器——返回操作 Float 的那些事 Flex布局 HTML5 data-* 自定义属性 参数传递的四种形式
es6 Object.assign 目录 一.基本用法 二.用途 1. 为对象添加属性 2. 为对象添加方法 3. 克隆对象 4. 合并多个对象 5. 为属性指定默认值 三.浏览器支持 ES6 O ...
- Eclipse中js文件修改后浏览器不能及时更新的解决办法
项目中js文件修改后浏览器不能及时更新的解决办法 转载:http://www.codeweblog.com/%E9%A1%B9%E7%9B%AE%E4%B8%ADjs%E6%96%87%E4%BB%B ...
- Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法
Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法 如下面所示,同时导入这两个,会提示其中一个与另一个产生冲突. 1i ...
- .NET在IE9中页面间URL传递中文变成乱码的解决办法
在.Net的项目中,鼠标点击查询按钮,转到查询页面,但URL中包含中文时,传到服务器端后,中文变成了乱码(只有IE9出现该问题). 尝试使用Server.UrlEncode()进行编码, ...
- electron-vue中使用iview 报错this. is readonly的解决办法
title: electron-vue中使用iview 报错this. is readonly的解决办法 toc: false date: 2019-02-12 19:33:28 categories ...
- (tamcat控制台乱码)在idea中运行toncat后控制台出现乱码的情况解决办法(教程附图)。
详细教程: (tamcat控制台乱码)在idea中运行toncat后控制台出现乱码的情况解决办法(教程附图)._IT打工酱的博客-CSDN博客
随机推荐
- 项目管理工具看板 All In One
项目管理工具看板 All In One Trello https://trello.com/ 我们来总结一下 Trello 是 Atlassian 旗下公司,所有使用 Trello 的人都将使用 At ...
- Emacs和Vim:神的编辑器和编辑器之神, 到底哪个更好?
Emacs和Vim:神的编辑器和编辑器之神, 到底哪个更好? 在这个蔚蓝色的星球上,流传着两大神器的传说:据说Emacs是神的编辑器,而Vim是编辑器之神. 一些人勇敢地拾起了Vim或Emacs,却发 ...
- React & Special Props Warning
React & Special Props Warning key & ref demo index.js:1 Warning: Comment: key is not a prop. ...
- 解析js字符串
myEval export const evalExp = /[!\&\|\+\-\*\%=\/<\>\^\(\)\~\:\?\;]/g; export function myEv ...
- Java中print、printf、println的区别
Java中print.printf.println的区别 区别 print:标准输出,但不换行,不可以空参: println:标准输出,但会自动换行,可以空参,可以看做:println()相当于pri ...
- 【python】递归听了N次也没印象,读完这篇你就懂了
听到递归总觉得挺高大上的,为什么呢?因为对其陌生,那么今天就来一文记住递归到底是个啥. 不过先别急,一起来看一个问题:求10的阶乘(10!). 求x的阶乘,其实就是从1开始依次乘到x.那么10的阶乘就 ...
- [Python学习笔记]爬虫
要使用Python 抓取网页,首先我们要学习下面四个模块: 包 作用 webbrowser 打开浏览器获取指定页面: requests 从因特网下载文件和网页: Beautiful Soup 解析HT ...
- 安装mysql报错
原文链接:https://blog.csdn.net/bao19901210/article/details/51917641 二进制安装 1.添加mysql组和mysql用户,用于设置mysql安装 ...
- yum install valgrind.x86_64
Reference: https://cloudlinux.zendesk.com/hc/en-us/articles/115004075294-Fix-rpmdb-Thread-died-in-Be ...
- 写了一个vue+antdv的后台管理模板
1,项目简介 写在前面===>这是一个vue+antdv的后台管理模板 项目地址: https://github.com/BaiFangZi/vue-antd-manage 1.1,概述 最 ...