.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

 

本人小白,大神勿喷!

posted @ 2021-03-30 10:57  一叶、知秋  阅读(3729)  评论(2编辑  收藏  举报