bagaimana atribut SameSite ditambahkan ke cookie Asp.net_SessionID saya secara otomatis?

20

Baru-baru ini samesite = lax tambahkan secara otomatis ke cookie sesi saya! atribut ini tambahkan saja ke sessionID: "Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"

Situs web saya di-host di IIS 8.5, Windows 2012 R2, dan tidak punya WAF atau UrlRewrite dan saya mematikan AntiVirus (kasper).

tetapi memiliki masalah yang sama pada beberapa server pelanggan.

ada ide?

Diedit: Saya menemukan ini: https://support.microsoft.com/en-us/help/4524419/kb4524419

ASP.NET sekarang akan memancarkan header cookie SameSite ketika nilai HttpCookie.SameSite adalah 'Tidak Ada' untuk mengakomodasi perubahan yang akan datang untuk penanganan cookie SameSite di Chrome. Sebagai bagian dari perubahan ini, cookie FormsAuth dan SessionState juga akan dikeluarkan dengan SameSite = 'Lax' alih-alih default sebelumnya 'None', meskipun nilai-nilai ini dapat ditimpa di web.config.

Bagaimana saya bisa mengganti cookie samesite untuk SessionState di web.config? saya menambahkan baris ini, tetapi tidak berfungsi pada cookie SessionID! <httpCookies sameSite="Unspecified" />

Diedit: Saya menemukan ini: https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSite

Tetapkan samesite untuk Stateserver dengan atribut "cookieSameSite" dari tag SessionState.

Sadegh
sumber
Sudahkah Anda menyelesaikannya dengan menambahkan “<sessionstate CookieSameSite"? Saya telah menginstal 4.8 tetapi ketika saya mengakses bagian sessionstate dari manajer IIS. Saya baru saja menerima atribut yang tidak dikenal.
Jokies Ding
1
saya menerima pesan yang sama di iis, tetapi berfungsi dan mengubah nilai samesite dalam waktu cookie yang ditentukan. saya menambahkan cookieSameSite = "Tidak ada" ke web.config saya untuk mendapatkan perilaku sebelumnya. perhatikan bahwa cookieSameSite adalah caseSesitive.
Sadegh
Saya hanya perlu menambal situs warisan 4.5.2 untuk ini - SameSite tidak didukung oleh konfigurasi sehingga saya harus mencegat cookie di Session_Start dan menulis ulang secara langsung dengan "SameSite = None; Secure" ditambahkan.
ParanoidCoder
@ TankaranCoder tangki saran Anda, saya menggunakan .net 4.6.1 dan bekerja untuk saya. Tetapi saya punya pertanyaan tentang solusi Anda: Anda menggunakan penulisan ulang URL (ekstensi IIS) atau Anda menulis ulang dengan kode di Session_Start, dapatkah Anda menunjukkan kode Anda?
Sadegh

Jawaban:

19

Tambahkan opsi ini ke web.config untuk sameSite = Tidak Ada, Kurang atau Ketat

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" />
    </authentication>
HJ van der Wijk
sumber
1
<httpCookies sameSitetidak ditampilkan sebagai opsi yang valid di .Net Framework 4.8
IronSean
Apakah itu berfungsi untuk kerangka kerja 4.6.1?
Ankush Jain
@AnkushJain, tidak, ini didukung sejak Net Framework 4.7.2.
Vasiliy Zverev
11

Saya tidak dapat menggunakan penulisan ulang, karena UrlRewrite tidak diinstal pada semua server pelanggan saya.

Akhirnya saya menambahkan cookieSameSite ke web.config saya:

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

Sadegh
sumber
2
ini hanya berfungsi setelah .net 4.7.2
mrlayeghi
1
saya menggunakannya di .net 4.6.1 dan berfungsi dengan baik.
Sadegh
Maaf @ Sadegh.K, tetapi tidak akan berfungsi sebelum 4.7.2 seperti yang dinyatakan di sini: docs.microsoft.com/en-us/aspnet/samesite/…
cederlof
@cederlof saya menemukan ini: support.microsoft.com/en-us/help/4533011/kb4533011
Sadegh
@ Sadegh Benar, tapi itu tidak menambah cookieSameSitefungsionalitas ke web.config - .NET 4.7.2 tidak. Tautan yang saya poskan di komentar saya juga ditautkan dari halaman yang Anda rujuk.
cederlof
8

Atribut CookieSameSite tidak tersedia untuk banyak kerangka kerja yang lebih lama. Jika Anda berada dalam situasi di mana jawaban yang diterima tidak didukung di lingkungan Anda, baca terus!

Saya memodifikasi beberapa jawaban SO untuk membuat penulisan ulang URL ini yang menambah SameSite=Nonecookie sesi, dan juga menghapus SameSite=Nonedari semua cookie untuk sebagian besar browser yang tidak kompatibel. Tujuan penulisan ulang ini adalah untuk menjaga perilaku "warisan" sebelum Chrome 80.

Tulisan lengkap di blog Coder Frontline saya :

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

Ini harus berfungsi untuk sebagian besar aplikasi ASP .Net dan ASP .Net Core, meskipun Kerangka yang lebih baru memiliki opsi kode dan konfigurasi yang tepat untuk memungkinkan Anda mengontrol perilaku ini. Saya akan merekomendasikan meneliti semua opsi yang tersedia untuk Anda sebelum menggunakan penulisan ulang saya di atas.

zemien
sumber
Di mana Anda meletakkan ini di MVC 5? Di <system.net></system.net>?
Joel Wiklund
In<system.webServer>
zemien
Catatan: jika cookie ASP.NET_SessionId sudah memiliki SameSite=Laxini hanya akan menambahkan SameSite=Nonedan tidak menggantinya.
cederlof
@zemien saya tidak mengerti mengapa memiliki (SameSite=.*)?semua dalam pola?
cederlof
1
@cederlofof Anda benar! Saya tidak menguji regex saya dengan benar karena lingkungan saya lebih tua. Kerangka Net yang tidak menambahkan properti Lax secara otomatis. Dalam kasus Anda, Anda dapat menggunakan regex berbeda untuk mengecualikan SameSite=Laxtajuk: ((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)Lihat pembaruan regex101.com/r/7D9UdO/3 - namun perlu dicatat bahwa regex ini akan mengecualikan apa pun yang Anda inginkan setelahnya, seperti tajuk aman. Ini harus menjadi kondisi yang langka sehingga intinya adalah untuk melihat apa yang dipancarkan OS + framework + aplikasi Anda dan tulis regex yang sesuai. Saya akan memperbarui jawaban saya untuk mencerminkan kedua cara :)
zemien
7

Pembaruan terakhir: jawaban zemien lebih komprehensif dan lengkap daripada jawaban saya. karena mengatur cookie berdasarkan agen pengguna.

Jawabanku:

Anda dapat mengganti SameSite = Lax dengan SameSite = Tidak ada untuk ASP.NET_SessionId di web.config dengan cara berikut:

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

Pembaruan: Untuk mencegah masalah iOS , ganti

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

dengan

<action type="Rewrite" value="{R:1};" />
Mohammad Reza Sadreddini
sumber
2
Ini hanya mungkin jika modul penulisan ulang IIS diinstal pada server
Vincent Ducroquet
1
Pembaruan Anda untuk masalah iOS juga akan menyebabkan masalah di OS yang lebih baru. Pada dasarnya, beberapa browser / OS akan menetapkan SameSite = Lax jika tidak ada header SameSite. Saya percaya satu-satunya cara adalah dengan melakukan UserAgent mengendus dan memutuskan apakah akan menyertakan header atau tidak. Saya masih meneliti apakah ini dapat dilakukan melalui web.config atau harus menyertakan perubahan kode di Session_Start.
zemien
Hanya untuk menyoroti apa yang dituliskan oleh zemien, pembaruan iOS Anda memperbaiki satu masalah tetapi memperkenalkan yang lain.
cederlof
3

@zemien solusi Anda dengan benar memecahkan masalah google chrome kami

Kami memiliki integrasi tempat aplikasi kami disematkan dalam iframe pada pihak ketiga. Chrome versi 80 dirilis 4 Februari 2020 mencegah cookie memuat.

Namun saya harus memodifikasi pola untuk menangkap semua cookie, menambahkan bendera Aman, dan ketentuan untuk tidak menerapkan penulisan ulang di localhost untuk lingkungan non https lokal kami

<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>
C Rudolph
sumber
1

Bekerja untukku. Ditambahkan ke file web.config saya:

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

Upgrade ke .Net Framework 4.8 + patch instalasi: Pembaruan Kumulatif 2019-12 untuk .NET Framework 3.5 dan 4.8 untuk Windows 10 Versi 1909 untuk x64 (KB4533002)

Stéphane
sumber