แอตทริบิวต์ SameSite เพิ่มให้กับคุกกี้ Asp.net_SessionID ของฉันโดยอัตโนมัติอย่างไร


20

เมื่อเร็ว ๆ นี้ samesite = lax เพิ่มโดยอัตโนมัติในเซสชันคุกกี้ของฉัน! คุณลักษณะนี้เพียงเพิ่มไปยัง sessionID: "Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"

เว็บไซต์ของฉันโฮสต์บน IIS 8.5, Windows 2012 R2 และไม่มี WAF หรือ UrlRewrite และฉันปิด AntiVirus (kasper)

แต่ยังมีปัญหาเดียวกันกับเซิร์ฟเวอร์ของลูกค้าบางราย

ความคิดใด ๆ

แก้ไข: ฉันค้นหาสิ่งนี้: https://support.microsoft.com/en-us/help/4524419/kb4524419

ASP.NET จะปล่อยส่วนหัวของคุกกี้ SameSite เมื่อค่า HttpCookie.SameSite เป็น 'ไม่มี' เพื่อรองรับการเปลี่ยนแปลงที่จะเกิดขึ้นกับการจัดการคุกกี้ SameSite ใน Chrome ในฐานะส่วนหนึ่งของการเปลี่ยนแปลงนี้คุกกี้ FormsAuth และ SessionState จะออกให้กับ SameSite = 'Lax' แทนค่าเริ่มต้นก่อนหน้าของ 'ไม่มี' แม้ว่าค่าเหล่านี้จะถูกแทนที่ใน web.config

ฉันจะแทนที่คุกกี้ samesite สำหรับ SessionState ใน web.config ได้อย่างไร ฉันเพิ่มบรรทัดนี้ แต่มันใช้ไม่ได้กับคุกกี้ SessionID! <httpCookies sameSite="Unspecified" />

แก้ไข:ฉันพบสิ่งนี้: https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSite

ตั้งค่า samesite สำหรับสถานะเซิร์ฟเวอร์โดยแอตทริบิวต์ "cookieSameSite" ของแท็ก SessionState


คุณได้รับการแก้ไขโดยการเพิ่ม“ <sessionstate CookieSameSite "? ฉันมี 4.8 ติดตั้ง แต่เมื่อฉันเข้าถึงส่วน sessionstate จาก IIS manager ฉันเพิ่งได้รับคุณลักษณะที่ไม่รู้จัก
Jokies Ding

1
ฉันได้รับข้อความเดียวกันใน iis แต่มันทำงานและเปลี่ยนค่า samesite ในเวลาชุดคุกกี้ ฉันเพิ่ม cookieSameSite = "ไม่มี" ใน web.config ของฉันเพื่อรับพฤติกรรมที่เหนือกว่า โปรดสังเกตว่า cookieSameSite เป็น caseSesitive
Sadegh

ฉันเพิ่งต้องแก้ไขไซต์ดั้งเดิม 4.5.2 สำหรับสิ่งนี้ - SameSite ไม่รองรับการกำหนดค่าดังนั้นฉันจึงต้องดักคุกกี้บน Session_Start และเขียนใหม่โดยตรงด้วยการเพิ่ม "SameSite = None; Secure"
ParanoidCoder

@ParanoidCoder ขอบคุณสำหรับคำแนะนำของคุณฉันใช้. net 4.6.1 และใช้งานได้สำหรับฉัน แต่ฉันมีคำถามเกี่ยวกับโซลูชันของคุณ: คุณใช้การเขียน URL ใหม่ (ส่วนขยายของ IIS) หรือคุณเขียนใหม่ด้วยรหัสใน Session_Start คุณสามารถแสดงรหัสของฉันได้หรือไม่
Sadegh

คำตอบ:


19

เพิ่มตัวเลือกเหล่านี้ไปยัง web.config สำหรับ sameSite = None, Lax หรือ Strict

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

1
<httpCookies sameSiteไม่แสดงเป็นตัวเลือกที่ถูกต้องใน. Net Framework 4.8
IronSean

มันทำงานกับกรอบ 4.6.1 หรือไม่
Ankush Jain

@AnkushJain ไม่สนับสนุนตั้งแต่. Net Framework 4.7.2
Vasiliy Zverev

11

ฉันไม่สามารถใช้การเขียนซ้ำได้เนื่องจาก UrlRewrite ไม่ได้ติดตั้งบนเซิร์ฟเวอร์ลูกค้าของฉันทั้งหมด

ในที่สุดฉันก็เพิ่ม cookieSameSite ไปยัง web.config ของฉัน:

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


2
ใช้งานได้หลังจาก. net 4.7.2
mrlayeghi

1
ฉันใช้มันใน. net 4.6.1 และใช้งานได้ดี
Sadegh

ฉันขอโทษ @ Sadegh.K แต่มันจะไม่ทำงานก่อน 4.7.2 ตามที่ระบุไว้ที่นี่: docs.microsoft.com/en-us/aspnet/samesite/…
cederlof

@cederlof ฉันพบสิ่งนี้: support.microsoft.com/en-us/help/4533011/kb4533011
Sadegh

@Sadegh ถูกต้อง แต่นั่นไม่ได้เพิ่มcookieSameSiteฟังก์ชั่นใน web.config -. NET 4.7.2 ลิงค์ที่ฉันโพสต์ในความคิดเห็นของฉันยังเชื่อมโยงจากหน้าเว็บที่คุณอ้างอิงด้วย
cederlof

8

แอตทริบิวต์ CookieSameSite ไม่สามารถใช้ได้สำหรับกรอบงานที่เก่ากว่าจำนวนมาก หากคุณอยู่ในสถานการณ์ที่ไม่รองรับคำตอบที่ยอมรับในสภาพแวดล้อมของคุณอ่านต่อ!

ฉันแก้ไขตามคำตอบ SO หลายข้อเพื่อให้เกิดการเขียน URL นี้ใหม่ซึ่งเพิ่มSameSite=Noneลงในเซสชันคุกกี้และลบออกSameSite=Noneจากคุกกี้ทั้งหมดสำหรับเบราว์เซอร์ที่เข้ากันไม่ได้ส่วนใหญ่ จุดประสงค์ของการเขียนซ้ำนี้คือการรักษาพฤติกรรม "ดั้งเดิม" ไว้ก่อน Chrome 80

บทความฉบับเต็มในบล็อก Coder Frontlineของฉัน:

<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="SessionCookieAddNoneHeader">
      <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 ส่วนใหญ่แม้ว่าเฟรมเวิร์กรุ่นใหม่จะมีตัวเลือกรหัสและการกำหนดค่าที่เหมาะสมเพื่อให้คุณสามารถควบคุมพฤติกรรมนี้ได้ ฉันขอแนะนำให้ทำการวิจัยตัวเลือกทั้งหมดที่มีให้คุณก่อนที่จะใช้การเขียนใหม่ของฉันข้างต้น


คุณใส่สิ่งนี้ไว้ใน MVC 5 ใน<system.net></system.net>?
Joel Wiklund

In<system.webServer>
zemien

หมายเหตุ: หาก ASP.NET_SessionId-cookie มีอยู่แล้วSameSite=Laxสิ่งนี้จะต่อท้ายSameSite=Noneและไม่แทนที่
cederlof

@zemien ฉันไม่เข้าใจว่าทำไมถึงมีปัญหา(SameSite=.*)?เลย?
cederlof

1
@cederlof คุณพูดถูก! ฉันไม่ได้ทดสอบ regex ของฉันอย่างถูกต้องเพราะสภาพแวดล้อมของฉันเก่ากว่า. Net framework ที่ไม่ได้เพิ่มคุณสมบัติ Lax โดยอัตโนมัติ ในกรณีของคุณคุณสามารถใช้ regex อื่นเพื่อแยกSameSite=Laxส่วนหัว: ((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)ดูregex101.com/r/7D9UdO/3 ที่อัปเดตแล้ว- อย่างไรก็ตามโปรดทราบว่า regex นี้จะยกเว้นสิ่งที่คุณอาจต้องการในภายหลังเช่นส่วนหัวที่ปลอดภัย นี่ควรเป็นเงื่อนไขที่หายากดังนั้นจุดสำคัญคือดูว่า OS + framework + app ของคุณมีการเปล่งและเขียน regex ให้เหมาะสม ฉันจะปรับปรุงคำตอบของฉันเพื่อสะท้อนให้เห็นทั้งสองวิธี :)
zemien

7

อัปเดตครั้งล่าสุด: คำตอบของเซมินนั้นครอบคลุมและสมบูรณ์กว่าของฉันมาก เพราะมันตั้งค่าคุกกี้ตามตัวแทนผู้ใช้

คำตอบของฉัน:

คุณสามารถแทนที่ SameSite = Lax ด้วย SameSite = None สำหรับ ASP.NET_SessionId ใน web.config ด้วยวิธีต่อไปนี้:

<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ให้แทนที่

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

กับ

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

2
สิ่งนี้เป็นไปได้เฉพาะเมื่อมีการติดตั้งโมดูล IIS rewriting บนเซิร์ฟเวอร์
Vincent Ducroquet

1
การอัปเดตสำหรับปัญหา iOS ของคุณจะทำให้เกิดปัญหาในระบบปฏิบัติการรุ่นใหม่ โดยพื้นฐานแล้วเบราว์เซอร์ / ระบบปฏิบัติการบางตัวจะกำหนด SameSite = Lax หากไม่มีส่วนหัว SameSite ฉันเชื่อว่าวิธีเดียวคือทำการดมกลิ่น UserAgent และตัดสินใจว่าจะรวมส่วนหัวหรือไม่ ฉันยังคงค้นคว้าว่าสิ่งนี้สามารถทำได้ผ่าน web.config หรือต้องมีการเปลี่ยนรหัสใน Session_Start
เซมิน

เพียงเพื่อเน้นสิ่งที่ @zemien เขียนการอัปเดต iOS ของคุณแก้ไขปัญหาหนึ่ง แต่แนะนำอีกอย่างหนึ่ง
cederlof

3

@zemien โซลูชันของคุณแก้ไขปัญหา Google chrome ของเราอย่างถูกต้อง

เรามีการรวมที่ฝังใบสมัครของเราใน iframe ในบุคคลที่สาม Chrome รุ่น 80 วางจำหน่ายวันที่ 4 ก.พ. 2020 ทำให้คุกกี้ไม่สามารถโหลดได้

อย่างไรก็ตามฉันต้องแก้ไขรูปแบบการจับคุกกี้ทั้งหมดเพิ่มการตั้งค่าสถานะความปลอดภัยและเงื่อนไขเพื่อไม่ให้ใช้การเขียนซ้ำบน localhost สำหรับสภาพแวดล้อม 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>

1

ได้ผลสำหรับฉัน เพิ่มลงในไฟล์ web.config ของฉันแล้ว:

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

อัปเกรดเป็น. Net Framework 4.8 + การติดตั้งแพตช์: 2019-12 การปรับปรุงที่สะสมสำหรับ. NET Framework 3.5 และ 4.8 สำหรับ Windows 10 เวอร์ชัน 1909 สำหรับ x64 (KB4533002)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.