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



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

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

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

是定义 SameSite 手动设置标头的一个选项。上面,键是饼干名称,值是饼干值

或者:

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

我已经测试了这些选项,两个选项似乎都可以工作

上面列出的值仅用于示例,您需要提供适当的值 [Lax|严格|无|等]。安全标志表示其仅通过 https 传输。扬子晚报

诀窍

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,从请求中读取的默认值为"无"。如果您在发送 Cookie 时不更改 SameSite-Property,浏览器将不会更新 Cookie,因为新 Cookie 的 SameSite-Property (None( 与原始 (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>

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

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

如果您使用的是表单身份验证,您也可以对 web.config 文件中的身份验证 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-path 来设置相同的站点属性:

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);

相关内容

  • 没有找到相关文章

最新更新