【问题标题】:How to set SameSite cookie attribute to explicit None ASP NET Core如何将 SameSite cookie 属性设置为显式无 ASP NET Core
【发布时间】:2019-09-27 17:27:31
【问题描述】:

Chrome 76 将开始支持显式 SameSite: None 属性

https://web.dev/samesite-cookies-explained/

我发现 ASP.NET Core 的当前实现将SameSiteMode.None 视为无操作并且不发送任何属性。如何向 cookie 添加自定义属性,从而在 cookie 文本中添加显式 SameSite: None

将属性附加到 cookie 值不起作用,因为 HttpResponse.Cookies.Append 对 cookie 值进行 url 编码。

【问题讨论】:

    标签: c# asp.net asp.net-core


    【解决方案1】:

    在 ASP.NET 中出现与在 ASP.NET Core 中相同的问题。

    在 Microsoft 提供修复之前,对我有用的 hack 是替换

    myCookie.Path = "/";
    myCookie.SameSite = SameSiteMode.None;     // has no effect
    

    myCookie.Path = "/; SameSite=None";
    

    这会将SameSite=None 添加到HTTP 响应中的set-cookie 标头。

    【讨论】:

    • 即使升级到 .NET Framework 4.8 并可以访问 HttpCookie.SameSite 属性,我们代码中 HttpResponseMessage 使用的 CookieHeaderValue 类仍然没有此属性可用。这个hack可能很难看,但最终对我有用。谢谢!
    • 我发现这种巧妙的技巧只有在您包含“Cookie.SameSite = SameSiteMode.None;”行时才有效
    【解决方案2】:

    现已在所有 .NET Framework 和 .NET Core 版本的最新版本中修复 (https://github.com/aspnet/AspNetCore/issues/12125)

    我有多个项目在 .NET Core 2.2 上运行,升级到 2.2.207 后,我不再遇到问题了。

    这里是Startup.cs 文件的ConfigureServices 方法中的示例代码

    services.ConfigureApplicationCookie(options => {
         options.Cookie.SameSite = SameSiteMode.None;
    });
    

    【讨论】:

    • 看不到任何关于 .NET Framework 已修复此问题的参考 - 该链接适用于 ASP .NET Core。
    • @FrodeNilsen 您是否发现它是否已在 .NET Framework 中更新?我已经更新到 4.8 还是有这个问题
    • @MichaelHancock 据我所知没有修复,但请参阅下面 Ygalbel 的回答。
    • @MichaelHancock 查看我对 .Net Framework 的回答:*.com/a/60090446/198797
    • 我浪费了几个小时试图弄清楚为什么这不起作用。谢谢!!!!
    【解决方案3】:

    [编辑] 如果您使用 nuget 的所有 dll 和包, 您必须确保 Microsoft.Net.Http.Headers 是以上版本的 2.2.8。

    在 2019 年 12 月 10 日来自微软的最后一个 KB 之后, 它应该在 .net 框架和 dotnetcore 中修复。

    见:

    1. https://docs.microsoft.com/en-us/aspnet/samesite/system-web-samesite
    2. https://docs.microsoft.com/en-us/aspnet/samesite/kbs-samesite

    【讨论】:

    • 我的 ASP.Net Core v2.2 应用程序绝对不会输出 SameSite=None cookie(没有像 @dmi_ 建议的那样手动设置标题) - 任何尝试这样做都会导致未指定SameSite 值。按照您的建议安装 Microsoft.Net.Http.Headers 解决了这个问题。
    【解决方案4】:

    response.Headers.Append("set-Cookie", $"{cookieName}={cookieValue}; path=/; SameSite=None; Secure"); 似乎按预期工作。

    我通过在 Chrome Dev 76 中启用 same-site-by-default-cookiescookies-without-same-site-must-be-secure 对此进行了测试

    【讨论】:

    • 2019年12月以后,看我的回答
    【解决方案5】:

    其他答案提到了 .Net Core 修复,所以我跳过那部分。

    .Net Framework 修复是通过“质量汇总”提供的。

    Here 是 .Net 4.8 的 KB。

    Here 是 .Net 4.7.2 的 KB。

    Here 是相关的 MSDN 来源。

    【讨论】:

      最近更新 更多