ASP.NET 4.7.2 C# WebForms için SameSite tanımlama bilgisi ö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
HttpCookie sameSiteCookie = 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;

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

Form kimlik doğrulaması tanımlama bilgisi için varsayılan sameSite özniteliği,cookieSameSiteweb.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 de içindeki oturum ayarlarının 'cookieSameSite' parametresinde ayarlanır web.config

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

Kasım 2019'da .NET'e yapılan güncelleştirme, Form 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 olarak geri almanız ve ardından tarayıcı özelliğine bağlı olarak davranışı ayarlamak none için aşağıda gösterilen kesme noktası kodunu eklemeniz gerekebilir.

Örneği çalıştırma

Örnek projeyi çalıştırırsanız ilk sayfada tarayıcı hata ayıklayıcınızı 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, "Tanımlama Bilgileri Oluştur" düğmesine tıkladığınızda örnek tarafından oluşturulan tanımlama bilgisinin, örnek kodda ayarlanan değerle eşleşen 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 tanımlama bilgisi sameSite özniteliğini ayarlama örneği için SameSiteCookieRewriter.cs dosyasına bakın.

public static void FilterSameSiteNoneForIncompatibleUserAgents(object sender)
{
    HttpApplication application = sender as HttpApplication;
    if (application != null)
    {
        var userAgent = application.Context.Request.UserAgent;
        if (SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent))
        {
            HttpContext.Current.Response.AddOnSendingHeaders(context =>
            {
                var cookies = context.Response.Cookies;
                for (var i = 0; i < cookies.Count; i++)
                {
                    var cookie = cookies[i];
                    if (cookie.SameSite == SameSiteMode.None)
                    {
                        cookie.SameSite = (SameSiteMode)(-1); // Unspecified
                    }
                }
            });
        }
    }
}

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 static void AdjustSpecificCookieSettings()
{
    HttpContext.Current.Response.AddOnSendingHeaders(context =>
    {
        var cookies = context.Response.Cookies;
        for (var i = 0; i < cookies.Count; i++)
        {
            var cookie = cookies[i]; 
            // Forms auth: ".ASPXAUTH"
            // Session: "ASP.NET_SessionId"
            if (string.Equals(".ASPXAUTH", cookie.Name, StringComparison.Ordinal))
            { 
                if (SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent))
                {
                    cookie.SameSite = -1;
                }
                else
                {
                    cookie.SameSite = SameSiteMode.None;
                }
                cookie.Secure = true;
            }
        }
    });
}

Daha Fazla Bilgi

Chrome Güncelleştirmeler

ASP.NET Belgeleri

.NET SameSite Düzeltme Ekleri