Aracılığıyla paylaş


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

.NET Framework 4.7, SameSite özniteliği için yerleşik desteğe sahiptir, ancak özgün standarda bağlıdır. Yama uygulanan davranış, özniteliğini SameSite.None değeri hiç yaymak yerine değeriyle Noneyaymak için değerinin anlamını değiştirdi. Değeri yaymak istemiyorsanız, tanımlama bilgisinde SameSite özelliğini -1 olarak ayarlayabilirsiniz.

SameSite özniteliğini yazma

Aşağıda, bir tanımlama bilgisine 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 istiyorsanız bu GitHub tartışma sorununda bize bildirin.

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

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

MVC Kimlik Doğrulaması

OWIN MVC tanımlama bilgisi tabanlı kimlik doğrulaması, tanımlama bilgisi özniteliklerinin değiştirilmesini sağlamak için bir tanımlama bilgisi yöneticisi kullanır. SameSiteCookieManager.vb, kendi projelerinize kopyalayabileceğiniz böyle bir sınıfın uygulamasıdır.

Microsoft.Owin bileşenlerinizin tümünün 4.1.0 veya sonraki bir sürüme yükseltildiğinden emin olmanız gerekir. Örneğin, tüm sürüm numaralarının eşleştiğinden emin olmak için dosyanızı packages.config denetleyin.

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <!-- other packages -->
  <package id="Microsoft.Owin.Host.SystemWeb" version="4.1.0" targetFramework="net472" />
  <package id="Microsoft.Owin.Security" version="4.1.0" targetFramework="net472" />
  <package id="Microsoft.Owin.Security.Cookies" version="4.1.0" targetFramework="net472" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net472" />
  <package id="Owin" version="1.0" targetFramework="net472" />
</packages>

Kimlik doğrulama bileşenleri, başlangıç sınıfınızda CookieManager'ı kullanacak şekilde yapılandırılmalıdır;

Public Sub Configuration(app As IAppBuilder)
    app.UseCookieAuthentication(New CookieAuthenticationOptions() With {
        .CookieSameSite = SameSiteMode.None,
        .CookieHttpOnly = True,
        .CookieSecure = CookieSecureOption.Always,
        .CookieManager = New SameSiteCookieManager(New SystemWebCookieManager())
    })
End Sub

CookieAuthentication ve OpenIdConnectAuthentication dahil olmak üzere, bunu destekleyen her bileşende bir tanımlama bilgisi yöneticisi ayarlanmalıdır.

SystemWebCookieManager, yanıt tanımlama bilgisi tümleştirmesiyle ilgili bilinen sorunlardan kaçınmak için kullanılır.

Örneği çalıştırma

Örnek projeyi çalıştırırsanız lütfen 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 sekmeye Application basın F12 ve bölümdeki seçeneğin Cookies altındaki site URL'sine Storage tıklayın.

Tarayıcı Hata Ayıklayıcısı Tanımlama Bilgisi Listesi

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

Denetlemediğiniz tanımlama bilgilerini durdurma

.NET 4.5.2, üst bilgilerin yazılmasında araya girilmesine yönelik yeni bir olay kullanıma sunulmuştur Response.AddOnSendingHeaders. Bu, tanımlama bilgilerini istemci makinesine iade edilmeden ö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ğer ayarlandıysa özniteliği yaymayacak şekilde değiştirir.

Olayı bağlama örneği için global.asax ve olayı işleme ve kendi kodunuza kopyalayabileceğiniz tanımlama bilgisi sameSite özniteliğini ayarlama örneği için SameSiteCookieRewriter.vb'ye 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, varsayılan kimlik doğrulama tanımlama bilgisini LaxNone değerini destekleyen None tarayıcılarda olarak ayarlar veya desteklemeyen Nonetarayı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ştirmeler

OWIN SameSite Belgeleri

ASP.NET Belgeleri

.NET SameSite Düzeltme Ekleri