如何在 .net 4.5.2 中将 SameSite 值设置为 None?

How to set SameSite value to None in .net 4.5.2?

当从第三方站点重定向回我的站点时,用户会话变为空。 我检查了 Response.Cookies["ASP.NET_SessionId"]; 在重定向后设置新值。 默认情况下,ASP.NET_SessionId 设置为 Lax。 在 .net framework 4.5.2 的 Session_Start 中更改 SameSite 值的任何可能方法 或者可能在任何地方?

使用旧版本的 .net 框架解决此限制的几个选项

HttpContext.Current.Response.Headers.Append("set-cookie", $"{key}={value}; path=/; SameSite=Strict; Secure");

是使用定义的 SameSite 手动设置 headers 的一个选项。以上,key为cookie名称,value为cookie值

或者:

myCookie.Path = "/; SameSite=Strict; Secure";

我已经测试了这些选项,它们似乎都有效

上面列出的值仅供参考,您需要提供适当的值 [Lax|Strict|None|etc]。 Secure 标志表示它仅通过 https 传输。 Ymmv

您可以在 web.config 文件中设置 cookieSameSite 属性:

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />

如果您使用表单身份验证,您也可以对 web.config 文件中的 auth-cookie 执行此操作:

<authentication mode="Forms">
  <forms cookieSameSite="None" />
</authentication>

例如在 SSRS 中:

<authentication mode="Forms">
  <forms loginUrl="logon.aspx" name="sqlAuthCookie" timeout="3000" path="/" cookieSameSite="None">
  </forms>
</authentication>

如果您在代码中为 System.Web.HttpCookie 执行此操作,则可以滥用 cookie 路径来设置同一站点属性:

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

例如

string userName = "MY_USER";
bool createPersistentCookie = true;
string strCookiePath = "/"; 


System.Web.HttpCookie authCookie = System.Web.Security.FormsAuthentication.GetAuthCookie(userName, createPersistentCookie, strCookiePath);


// intranet urls most of the times should not contain a dot 
// so this means if(not intranet)
// if (current.Request.Url.Host.Contains("."))
// secure can only be set when protocol is https
if ("https".Equals(current.Request.Url.Scheme, System.StringComparison.InvariantCultureIgnoreCase)) 
{
    //authCookie.Path = "/; SameSite=Strict";
    authCookie.Path = strCookiePath + "; SameSite=None";
    authCookie.Secure = true;
} 

System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);

技巧

cookie.Path = strCookiePath + "; SameSite=None";

不再有效 (Fx 4.5.2)。我搜索了一整天的解决方案,因为我们无法为有问题的站点升级 Fx 版本。

对于请求中存在 cookie 的情况,我们找到了以下解决方案:

using System.Reflection;
...
HttpCookie cookie = HttpContext.Current.Request.Cookies[key];
cookie.Secure = false; // Set whatever properties you need

PropertyInfo pti = cookie.GetType().GetProperty("SameSite");
if ( null != pti )
{
    pti.SetValue( cookie, -1 );  // -1 => Lax, 0 => None
}

HttpContext.Current.Response.Cookies.Add( cookie );

我希望它可能对某些人有用。这里的要点是,cookie 是用 FormsAuthentication.SetAuthCookie 设置的,它没有为 SameSite 设置值。浏览器将缺少的 属性 转换为“Lax”值。如果要重置 cookie,从请求中读取的默认值为“None”。如果您在不更改 SameSite-属性 的情况下发送 cookie,浏览器将不会更新 cookie,因为新 cookie (None) 的 SameSite-属性 与原始 (Lax).

因此您必须以某种方式更改该值。但是由于浏览器将 属性 发送到服务器,因此 属性 存在并且可以使用反射更改。

只需添加 web.config

<rewrite>
  <outboundRules>
    <rule name="Add SameSite" preCondition="No SameSite">
      <match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" />
      <action type="Rewrite" value="{R:0}; SameSite=none; Secure=true" />
      <conditions>
      </conditions>
    </rule>
    <preConditions>
      <preCondition name="No SameSite">
        <add input="{RESPONSE_Set_Cookie}" pattern="." />
        <add input="{RESPONSE_Set_Cookie}" pattern="; SameSite=none; Secure=true" negate="true" />
      </preCondition>
    </preConditions>
  </outboundRules>
</rewrite>