iis 如何将SameSite属性自动添加到我的Asp.net_SessionID cookie中?

gstyhher  于 12个月前  发布在  .NET
关注(0)|答案(8)|浏览(317)

最近samesite=lax自动添加到我的会话cookie!这个属性只是添加到sessionID:"Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"
我的网站托管在IIS 8.5,Windows 2012 R2上,没有WAF或UrlRewrite,我关闭了防病毒(kasper)。
但是在一些客户服务器上仍然存在相同的问题。
知道吗?

**编辑:**我找到这个:https://support.microsoft.com/en-us/help/4524419/kb4524419

现在,当HttpCookie.SameSite值为“None”时,ASP.NET将发出SameSite Cookie标头,以适应Chrome中即将对SameSite Cookie处理进行的更改。作为此更改的一部分,FormsAuth和SessionState Cookie也将使用SameSite =“Lax”而不是以前的默认值“None”发出,尽管这些值可以在web. config中覆盖。
如何在web.config中覆盖SessionState的相同站点cookie?我添加了这一行,但它对SessionID cookie无效!<httpCookies sameSite="Unspecified" />

**编辑:**我发现这个:https://learn.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSite

通过SessionState标记的“cookieSameSite”属性为stateserver设置同一站点。

r7xajy2e

r7xajy2e1#

将这些选项添加到web.config中,设置sameSite=None、Lax或Strict

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" />
    </authentication>

字符串

zvms9eto

zvms9eto2#

CookieSameSite属性在很多老框架中是不可用的。如果你的环境不支持接受的答案,请继续阅读!
我修改了几个SO答案,提出了这个URL重写,将SameSite=None添加到会话cookie中,并从大多数不兼容的浏览器的 * 所有 * cookie中删除SameSite=None。这个重写的目的是保留Chrome 80之前的“传统”行为。
在我的Coder Frontline blog中的完整文章:

<rewrite>
  <outboundRules>
    <preConditions>
      <!-- Checks User Agent to identify browsers incompatible with SameSite=None -->
      <preCondition name="IncompatibleWithSameSiteNone" logicalGrouping="MatchAny">
        <add input="{HTTP_USER_AGENT}" pattern="(CPU iPhone OS 12)|(iPad; CPU OS 12)" />
        <add input="{HTTP_USER_AGENT}" pattern="(Chrome/5)|(Chrome/6)" />
        <add input="{HTTP_USER_AGENT}" pattern="( OS X 10_14).*(Version/).*((Safari)|(KHTML, like Gecko)$)" />
      </preCondition>
    </preConditions>

    <!-- Adds or changes SameSite to None for the session cookie -->
    <!-- Note that secure header is also required by Chrome and should not be added here -->
    <rule name="SessionCookieAddSameSiteNoneHeader">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*ASP.NET_SessionId.*)" />
      <!-- Use this regex if your OS/framework/app adds SameSite=Lax automatically to the end of the cookie -->
      <!-- <match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)" /> -->
      <action type="Rewrite" value="{R:1}; SameSite=None" />
    </rule>

    <!-- Removes SameSite=None header from all cookies, for most incompatible browsers -->
    <rule name="CookieRemoveSameSiteNone" preCondition="IncompatibleWithSameSiteNone">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=None)" />
      <action type="Rewrite" value="{R:1}" />
    </rule>
  </outboundRules>
</rewrite>

字符串
这应该适用于大多数ASP.NET和ASP.NET Core应用程序,尽管较新的Framework有适当的代码和配置选项让您控制此行为。我建议您在使用我上面的重写之前研究所有可用的选项。

x8goxv8g

x8goxv8g3#

我不能使用重写,因为UrlRewrite没有安装在我所有的客户服务器上。
最后,我将cookieSameSite添加到我的web.config中:

<sessionState mode="StateServer" cookieSameSite="None" sqlConnectionString="data source=(local);user id=sa;password=" cookieless="false" timeout="20" />

字符串

t40tm48m

t40tm48m4#

最后更新:zemien's answer比我的更全面和完整。因为它基于用户代理设置cookie。

我的回答:
你可以用SameSite=None替换Web.config中ASP.NET_SessionId的SameSite=Lax,方法如下:

<rewrite>
  <outboundRules>
    <rule name="AddSameSiteCookieFlag">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASP.NET_SessionId)(=.*))(SameSite=Lax)" />
      <action type="Rewrite" value="{R:1};SameSite=None" />
    </rule>
  </outboundRules>
</rewrite>

字符串

**更新:**要防止IOS problem,请替换

<action type="Rewrite" value="{R:1};SameSite=None" />


<action type="Rewrite" value="{R:1};" />

bmp9r5qi

bmp9r5qi5#

@zemien您的解决方案正确地解决了我们的谷歌Chrome问题
我们有一个集成,其中我们的应用程序嵌入在第三方的iframe中。2020年2月4日发布的Chrome版本80阻止了cookie加载。
然而,我不得不修改模式以捕获所有cookie,添加Secure标志,并在本地非https环境中不应用本地主机上的重写

<rule name="SessionCookieAddNoneHeader">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=.*)?" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
      <action type="Rewrite" value="{R:1}; SameSite=None; Secure" />
</rule>

字符串

fjnneemd

fjnneemd6#

对我有用。添加到我的web.config文件中:

<sessionState cookieSameSite="None"></sessionState>

字符串
升级到.NET Framework 4.8 +安装修补程序:2019-12.NET Framework 3.5和4.8累积更新Windows 10版本1909 x64(KB 4533002)

3qpi33ja

3qpi33ja7#

4台机器与谷歌Chrome一个不会与cookie跨网站上的asp. Folow H. J.货车德Wijk信息为web.config

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" />
    </authentication>

字符串
还是不行,得换

<httpCookies sameSite="None"/>


<httpCookies httpOnlyCookies="true" requireSSL="true" sameSite="None"/>


一切正常
谢谢

cigdeys3

cigdeys38#

将这些选项添加到web.config中,设置sameSite=None、Lax或Strict

<system.web>
    <httpCookies sameSite="None" requireSSL="true" />
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" requireSSL="true" />
    </authentication>
</system.web>

字符串
自.Net Framework 4.7.2起支持此功能。
Docs on sessionState cookieSameSite
在httpCookies sameSite上搜索
SameSite=None需要SecurerequireSSL="true")。LaxStrict不需要。sessionState没有requireSSL,使用httpCookies的属性。
Good article with explanation of SameSite in Google Chrome . Chrome自80版起阻止iframe中的第三方Cookie。

相关问题