• .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

    本人小白,大神勿喷!

    喜欢本文章的朋友,欢迎关注公众号【程序员在职场】支持一下作者。

    声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    ScottGu: 宣布微软 AJAX CDN
    表格数据流协议TDS
    .NET 4 System.Threading.Barrier 类
    企业架构思考
    OpenSSL的托管项目
    WCF服务中操作FormsAuthentication的Cookie
    Silverlight相关博客收集20090927
    Sync Framework 2.0
    [中央电视台·见证]大学堂——兰州大学
    系统进程管理工具Process Explorer
  • 原文地址:https://www.cnblogs.com/w821759016/p/14595832.html
Copyright © 2020-2023  润新知