SameSite özniteliği Asp.net_SessionID çerezime otomatik olarak nasıl eklendi?


20

Son zamanlarda samesite = lax oturum çerezime otomatik olarak ekle! bu özellik sadece sessionID öğesine ekler: "Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"

Web sitem IIS 8.5, Windows 2012 R2'de barındırıldı ve WAF veya UrlRewrite'e sahip değilim ve AntiVirus'u (kasper) kapatıyorum.

ancak yine de bazı müşteri sunucularında aynı sorunu yaşıyoruz.

Herhangi bir fikir?

DÜZENLENİYOR: Bunu buluyorum : https://support.microsoft.com/en-us/help/4524419/kb4524419

ASP.NET, HttpCookie.SameSite değeri Chrome'da SameSite çerez işlemesinde yapılacak değişiklikleri karşılamak için 'None' olduğunda bir SameSite çerez başlığı yayınlayacaktır. Bu değişikliğin bir parçası olarak, FormsAuth ve SessionState çerezleri de önceki 'None' varsayılanı yerine SameSite = 'Lax' ile verilecektir, ancak bu değerler web.config dosyasında geçersiz kılınabilir.

Web.config dosyasında SessionState için aynı sitedeki çerezleri nasıl geçersiz kılabilirim? Bu satırı ekleyin, ancak SessionID çerez üzerinde çalışmıyor! <httpCookies sameSite="Unspecified" />

DÜZENLENİYOR: Bunu buldum: https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSite

Durum sunucusu için SamesState etiketinin "cookieSameSite" özniteliği ile aynı siteyi ayarlayın.


“<Sessionstate CookieSameSite” ekleyerek çözülmüş mü? 4.8 4.8 yükledim, ancak IIS yöneticisinden oturum bölümü bölümüne eriştiğimde, sadece tanınmayan bir özellik
alıyorum

1
iis aynı mesajı alırsınız, ancak çalışır ve set-çerez zamanında samesite değerini değiştirir. i previuse behvior almak için web.config için cookieSameSite = "None" ekleyin. cookieSameSite'ın caseSesitive olduğunu unutmayın.
Sadegh

Ben sadece bunun için 4.5.2 eski bir site yama gerekiyordu - SameSite yapılandırmalar tarafından desteklenmedi bu yüzden Session_Start çerez yakalamak ve doğrudan "SameSite = None; Secure" eklendi ile yeniden yazmak zorunda kaldı.
ParanoidCoder

@ParanoidCoder size önermek için tank, ben .net 4.6.1 kullanın ve benim için çalışıyor. Ancak çözümünüzle ilgili bir sorum var: URL yeniden yazma (IIS uzantısı) kullanıyorsunuz veya Session_Start'ta kod ile yeniden yazıyorsunuz, bana kodunuzu gösterebilir misiniz?
Sadegh

Yanıtlar:


19

SameSite = None, Lax veya Strict için web.config dosyasına bu seçenekleri ekleyin

<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 çerçevesi için çalışıyor mu?
Ankush Jain

@AnkushJain, hayır, .Net Framework 4.7.2'den beri desteklenmektedir.
Vasiliy Zverev

11

Yeniden yazma özelliğini kullanamıyorum, çünkü UrlRewrite tüm müşterilerim sunucularında yüklü değil.

Sonunda benim web.config için cookieSameSite ekleyin:

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


2
sadece .net
4.7.2'den

1
i .net 4.6.1 kullanmak ve iyi çalışıyor.
Sadegh

Üzgünüm @ Sadegh.K, ancak burada belirtildiği gibi 4.7.2'den
cederlof


@Sadegh Doğru, ancak cookieSameSiteweb.config işlevini eklemez - .NET 4.7.2 yapar. Yorumuma gönderdiğim bağlantı, atıfta bulunduğunuz sayfadan da bağlantılıdır.
cederlof

8

CookieSameSite özniteliği birçok eski çerçeve için kullanılamaz. Kabul edilen cevabın ortamınızda desteklenmediği bir durumdaysanız okumaya devam edin!

Ben ekleyen bu URL yeniden yazma ile gelip birkaç SO cevapları üzerine modifiye SameSite=Noneoturumu çerezlere ve ayrıca kaldırmak SameSite=Nonegelen tüm en uyumsuz tarayıcılar için kurabiye. Bu yeniden yazmanın amacı, Chrome 80 öncesi "eski" davranışı korumaktır.

Coder Frontline blogumda tam yazı :

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

Bu, çoğu ASP .Net ve ASP .Net Core uygulaması için çalışmalıdır, ancak yeni Frameworks bu davranışı denetlemenize olanak tanıyan uygun kod ve yapılandırma seçeneklerine sahiptir. Yukarıdaki yeniden yazımı kullanmadan önce kullanabileceğiniz tüm seçenekleri araştırmanızı tavsiye ederim.


Bunu MVC 5'te nereye koyarsınız? In <system.net></system.net>?
Joel Wiklund

In<system.webServer>
zemien

Not: ASP.NET_SessionId-çerezi zaten varsa, SameSite=Laxbunu sadece ekler SameSite=Noneve değiştirmez.
cederlof

@zemien Neden (SameSite=.*)?desende hiç var anlamıyorum ?
cederlof

1
@cederlof haklısın! Ortamım daha eski olduğu için normal ifademi düzgün bir şekilde test etmedim. Lax özelliğini otomatik olarak eklemeyen Net çerçevesi. Sizin durumunuzda, SameSite=Laxbaşlığı hariç tutmak için farklı bir normal ifade kullanabilirsiniz : ((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)Güncellenmiş regex101.com/r/7D9UdO/3 adresine bakın - ancak bu normal ifadenin daha sonra güvenli başlık gibi isteyebileceğiniz her şeyi hariç tutacağını unutmayın. Bu nadir bir durum olmalı, bu yüzden kilit nokta, OS + framework + uygulamanızın ne yaydığını görmek ve uygun olan regex'i yazmaktır. Cevabımı her iki şekilde de yansıtacak şekilde güncelleyeceğim :)
zemien

7

Son güncelleme: zemien'in cevabı benimkinden daha kapsamlı ve eksiksiz. çünkü çerezleri kullanıcı aracısına göre ayarlar.

Cevabım:

Web.config dosyasında ASP.NET_SessionId için SameSite = Lax'ı SameSite = None ile değiştirebilirsiniz:

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

Güncelleme: IOS problemini önlemek için değiştirin

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

ile

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

2
Bu, yalnızca sunucuya IIS yeniden yazma modülü yüklüyse mümkündür
Vincent Ducroquet

1
İOS sorunuyla ilgili güncellemeniz daha yeni işletim sistemlerinde de sorunlara neden olacaktır. Temel olarak, bazı tarayıcılar / işletim sistemi SameSite üstbilgisini eksikse SameSite = Lax atar. Tek yol UserAgent koklama yapmak ve üstbilgiyi dahil etmek için olup olmadığını karar olduğuna inanıyorum. Hala bu web.config üzerinden yapılabilir veya Session_Start bir kod değişikliği eklemek zorunda olup olmadığını araştırıyorum.
zemien

@Zemien'in yazdıklarını vurgulamak için iOS güncellemeniz bir sorunu düzeltiyor, ancak başka bir sorunu getiriyor.
cederlof

3

@zemien çözümünüz Google Chrome sorunlarımızı doğru bir şekilde çözdü

Uygulamamızın üçüncü bir tarafa iframe içine yerleştirildiği bir entegrasyonumuz var. 4 Şubat 2020'de yayınlanan Chrome sürüm 80, çerezlerin yüklenmesini engelledi.

Ancak, tüm çerezleri yakalamak, Güvenli bayrağı eklemek ve yerel https olmayan ortamımız için localhost'a yeniden yazma özelliğini uygulamak için koşulu değiştirmek zorunda kaldım

<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

Benim için çalışıyor. Web.config dosyama eklendi:

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

Net Framework 4.8 + kurulum yamasına yükseltme: 2019-12 Windows 10 için .NET Framework 3.5 ve 4.8 Toplu Güncelleştirmesi x64 için Sürüm 1909 (KB4533002)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.