如何在 .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>
当从第三方站点重定向回我的站点时,用户会话变为空。 我检查了 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>