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 uyar. Düzeltme eki uygulanmış davranış, değeri bir Nonebir değere yaymaması yerine, özniteliği bir değeri olarak göstermek için SameSite.None anlamını değiştirdi. Değeri göstermek istiyorsanız, bir tanımlama bilgisinde SameSite özelliğini-1 olarak ayarlayabilirsiniz.

SameSite özniteliği yazılıyor

Aşağıda, bir tanımlama bilgisine bir 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 Ingilizce dışındaki bir dilde okuyorsanız, kod açıklamalarını yerel dilinizde görmek istiyorsanız bu GitHub tartışma sorununu bize gönderin.

Form kimlik doğrulaması tanımlama bilgisinin varsayılan sameSite özniteliği, web.config içindeki Forms kimlik doğrulama ayarlarının cookieSameSite parametresinde ayarlanır.

<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, web.config oturum ayarlarının ' tanımlama bilgisi Esamesitesi ' parametresinde de ayarlanır.

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

.NET için Kasım 2019 güncelleştirmesi, en uyumlu ayar olduğu gibi, form kimlik doğrulaması ve oturumunun varsayılan ayarlarını lax olarak değiştirdi, ancak iframe 'lere sayfa eklerseniz, bu ayarı None olarak döndürmeniz ve ardından, tarayıcı özelliğine bağlı olarak none davranışını ayarlamak için aşağıda gösterilen yakam kodunu eklemeniz gerekebilir.

Örneği çalıştırma

Örnek projeyi çalıştırırsanız, ilk sayfada tarayıcı hata ayıklayıcıyı yükleyin ve site için tanımlama bilgisi toplamasını görüntülemek için kullanın. Bunu kenar ve Chrome 'a bas F12 için Application sekmesini seçin ve Storage bölümündeki Cookies seçeneğinin altındaki site URL 'sine tıklayın.

Tarayıcı hata ayıklayıcısı tanımlama bilgisi listesi

"Tanımlama bilgileri oluştur" düğmesine tıkladığınızda örnek tarafından oluşturulan tanımlama bilgisinin, örnek koddaayarlanan değerle eşleşen Laxbir SameSite özniteliği değerine sahip olduğunu görebilirsiniz.

Denetleyeistemediğiniz tanımlama bilgilerini kesintiye uğratan

.NET 4.5.2, Response.AddOnSendingHeadersüstbilgilerin yazılmasını kesintiye uğratan yeni bir olay sunmuştur. Bu, tanımlama bilgilerini istemci makinesine döndürülmeden önce ele almak için kullanılabilir. Örnekte, tarayıcının yeni sameSite değişikliklerini destekleyip desteklemediğini kontrol eden bir statik yönteme yönelik olarak, yeni None değeri ayarlanmışsa, tanımlama bilgilerini özniteliği göstermeme olarak değiştirir.

Olayı işleme ve tanımlama bilgisi sameSite özniteliğini ayarlama hakkında bir örnek için bkz . Global. asax .

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 bir adlandırılmış tanımlama bilgisi davranışını çok aynı şekilde değiştirebilirsiniz; Aşağıdaki örnek, Lax varsayılan kimlik doğrulama tanımlama bilgisini None değerini destekleyen tarayıcılarda None olarak ayarlayın veya Nonedesteklemeyen tarayı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ştirmeleri

ASP.NET belgeleri

.NET SameSite yamaları