当从第三方网站重定向回我的网站时,用户会话变为空。 我已经检查了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);