ASP.NET 4.7.2 C# WebForms Için SameSite tanımlama bilgisi örneğiSameSite cookie sample for ASP.NET 4.7.2 C# WebForms

.NET Framework 4,7, SameSite özniteliği için yerleşik desteğe sahiptir, ancak özgün standarda uyar..NET Framework 4.7 has built-in support for the SameSite attribute, but it adheres to the original standard. 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.The patched behavior changed the meaning of SameSite.None to emit the attribute with a value of None, rather than not emit the value at all. Değeri göstermek istiyorsanız, bir tanımlama bilgisinde SameSite özelliğini-1 olarak ayarlayabilirsiniz.If you want to not emit the value you can set the SameSite property on a cookie to -1.

SameSite özniteliği yazılıyorWriting the SameSite attribute

Aşağıda, bir tanımlama bilgisine bir SameSite özniteliği yazma örneği verilmiştir;Following is an example of how to write a SameSite attribute on a cookie;

// 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.If you are reading this in a language other than English, let us know in this GitHub discussion issue if you’d like to see the code comments in your native language.

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.The default sameSite attribute for a forms authentication cookie is set in the cookieSameSite parameter of the forms authentication settings in web.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, web.config oturum ayarlarının ' tanımlama bilgisi Esamesitesi ' parametresinde de ayarlanır.The default sameSite attribute for session state is also set in the 'cookieSameSite' parameter of the session settings in web.config

<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.The November 2019 update to .NET changed the default settings for Forms Authentication and Session to lax as is the most compatible setting, however if you embed pages into iframes you may need to revert this setting to None, and then add the interception code shown below to adjust the none behavior depending on browser capability.

Örneği çalıştırmaRunning the sample

Ö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.If you run the sample project load your browser debugger on the initial page and use it to view the cookie collection for the site. 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.To do so in Edge and Chrome press F12 then select the Application tab and click the site URL under the Cookies option in the Storage section.

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.You can see from the image above that the cookie created by the sample when you click the "Create Cookies" button has a SameSite attribute value of Lax, matching the value set in the sample code.

Denetleyeistemediğiniz tanımlama bilgilerini kesintiye uğratanIntercepting cookies you do not control

.NET 4.5.2, Response.AddOnSendingHeadersüstbilgilerin yazılmasını kesintiye uğratan yeni bir olay sunmuştur..NET 4.5.2 introduced a new event for intercepting the writing of headers, Response.AddOnSendingHeaders. Bu, tanımlama bilgilerini istemci makinesine döndürülmeden önce ele almak için kullanılabilir.This can be used to intercept cookies before they are returned to the client machine. Ö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.In the sample we wire up the event to a static method which checks whether the browser supports the new sameSite changes, and if not, changes the cookies to not emit the attribute if the new None value has been set.

Olayı işleme ve tanımlama bilgisi sameSite özniteliğini ayarlama hakkında bir örnek için bkz . Global. asax .See global.asax for an example of hooking up the event and SameSiteCookieRewriter.cs for an example of handling the event and adjusting the cookie sameSite attribute.

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.You can change specific named cookie behavior in much the same way; the sample below adjust the default authentication cookie from Lax to None on browsers which support the None value, or removes the sameSite attribute on browsers which do not support None.

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

Chrome güncelleştirmeleriChrome Updates

ASP.NET belgeleriASP.NET Documentation

.NET SameSite yamaları.NET SameSite Patches