ASP.NET 4.7.2 VB WebForms SameSite çerez örneği için

.NET Framework 4.7, SameSite özniteliği için yerleşik desteğe sahiptir, ancak özgün standarda uyar. Düzeltme sonrası davranış, öğenin anlamını SameSite.None'ın, değerini hiç yaymamak yerine None değeriyle yayımlayacak şekilde değiştirdi. Değeri yaymamak istiyorsanız, bir çerezdeki SameSite özelliğini -1 olarak ayarlayabilirsiniz.

SameSite özniteliğini yazma

Aşağıda, bir çereze SameSite özniteliği yazma örneği verilmiştir.

' Create the cookie
Dim sameSiteCookie As New HttpCookie("sameSiteSample")

' Set a value for the cookie
sameSiteCookie.Value = "sample"

' Set the secure flag, which Chrome's changes will require for SameSite none.
' Note this will also require you to be running on HTTPS
sameSiteCookie.Secure = True

' Set the cookie to HTTP only which is good practice unless you really do need
' to access it client side in scripts.
sameSiteCookie.HttpOnly = True

' Expire the cookie in 1 minute
sameSiteCookie.Expires = Date.Now.AddMinutes(1)

' Add the SameSite attribute, this will emit the attribute with a value of none.
' To Not emit the attribute at all set the SameSite property to -1.
sameSiteCookie.SameSite = SameSiteMode.None

' Add the cookie to the response cookie collection
Response.Cookies.Add(sameSiteCookie)

Bunu İngilizce dışında bir dilde okuyorsanız, kod açıklamalarını ana dilinizde görmek isterseniz bu GitHub tartışma sorununda bize bildirin.

Form kimlik doğrulama tanımlama bilgisi için varsayılan sameSite özniteliği, form kimlik doğrulama ayarlarındaki cookieSameSite parametresinde ayarlanmıştırweb.config

<system.web>
  <authentication mode="Forms">
    <forms name=".ASPXAUTH" loginUrl="~/" cookieSameSite="None" requireSSL="true">
    </forms>
  </authentication>
</system.web>

Oturum durumu için varsayılan sameSite özniteliği, oturum ayarlarının 'cookieSameSite' parametresinde de ayarlanır web.config

<system.web>
  <sessionState cookieSameSite="None">     
  </sessionState>
</system.web>

Kasım 2019'da .NET güncelleştirmesi, Forms Kimlik Doğrulaması ve Oturum lax için varsayılan ayarları en uyumlu ayar olarak değiştirmiştir, ancak sayfaları iframe'lere eklerseniz bu ayarı Yok'a döndürmeniz ve ardından tarayıcı özelliğine bağlı olarak davranışı ayarlamak için aşağıda gösterilen none kodunu eklemeniz gerekebilir.

Örneği çalıştırma

Örnek projeyi çalıştırırsanız, tarayıcı hata ayıklayıcınızı ilk sayfaya yükleyin ve sitenin tanımlama bilgisi koleksiyonunu görüntülemek için kullanın. Edge ve Chrome'da bunu yapmak için F12 tuşlarına basın, ardından Application sekmesini seçin ve Storage bölümündeki Cookies seçeneği altında yer alan site URL'sine tıklayın.

Tarayıcı Hata Ayıklayıcı Çerez Listesi

Yukarıdaki görüntüden, "Tanımlama Bilgileri Oluştur" düğmesine tıkladığınızda örnek tarafından oluşturulan tanımlama bilgisinin, Lax ayarlanan değerle eşleşen SameSite öznitelik değerine sahip olduğunu görebilirsiniz.

Kontrol etmediğiniz çerezleri ele geçirme

.NET 4.5.2, üst bilgilerin yazılması sırasında araya girilmesi için yeni bir olay tanıttı Response.AddOnSendingHeaders. Bu, tanımlama bilgilerini istemci makinesine geri gönderilmeden önce kesmek için kullanılabilir. Örnekte, olayı tarayıcının yeni sameSite değişikliklerini destekleyip desteklemediğini denetleyen statik bir yönteme bağlarız ve desteklemiyorsa, tanımlama bilgilerini, yeni None değeri ayarlandığında özniteliği içermeyecek şekilde değiştirir.

Olay bağlantısı örneği için global.asax dosyasına bakın ve olayı işleme ve tanımlama bilgisi özniteliğini ayarlama örneği için SameSiteCookieRewriter.cs dosyasına bakın.

Sub FilterSameSiteNoneForIncompatibleUserAgents(ByVal sender As Object)
    Dim application As HttpApplication = TryCast(sender, HttpApplication)

    If application IsNot Nothing Then
        Dim userAgent = application.Context.Request.UserAgent

        If SameSite.DisallowsSameSiteNone(userAgent) Then
            application.Response.AddOnSendingHeaders(
                Function(context)
                    Dim cookies = context.Response.Cookies

                    For i = 0 To cookies.Count - 1
                        Dim cookie = cookies(i)

                        If cookie.SameSite = SameSiteMode.None Then
                            cookie.SameSite = CType((-1), SameSiteMode)
                        End If
                    Next
                End Function)
        End If
    End If
End Sub

Belirli adlandırılmış tanımlama bilgisi davranışını aynı şekilde değiştirebilirsiniz; Aşağıdaki örnek, None değerini destekleyen tarayıcılarda varsayılan kimlik doğrulama tanımlama bilgisini None ile değiştirir veya None'ü desteklemeyen tarayıcılarda SameSite özniteliğini kaldırır.

Public Shared Sub AdjustSpecificCookieSettings()
    HttpContext.Current.Response.AddOnSendingHeaders(Function(context)
            Dim cookies = context.Response.Cookies

            For i = 0 To cookies.Count - 1
            Dim cookie = cookies(i)

            If String.Equals(".ASPXAUTH", cookie.Name, StringComparison.Ordinal) Then

                If SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent) Then
                    cookie.SameSite = -1
                Else
                    cookie.SameSite = SameSiteMode.None
                End If

                cookie.Secure = True
            End If
            Next
        End Function)
End Sub

Daha Fazla Bilgi

Chrome Güncelleştirmeleri

ASP.NET Belgeleri

.NET SameSite Yamaları