ASP.NET 4.7.2 C# MVC 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.
Düzeltme eki uygulanan davranış, özniteliğini SameSite.None
değeri None
hiç yaymak yerine değeriyle yaymak için değerinin anlamını değiştirdi. Değeri yaymak istemiyorsanız, bir tanımlama bilgisinde SameSite
özelliğini -1 olarak ayarlayabilirsiniz.
SameSite özniteliğini yazma
Aşağıda, tanımlama bilgisine SameSite özniteliği yazma örneği verilmiştir;
// Create the cookie
HttpCookie sameSiteCookie = new HttpCookie("SameSiteSample");
// Set a value for the cookieSite none.
// Note this will also require you to be running on HTTPS
sameSiteCookie.Value = "sample";
// Set the secure flag, which Chrome's changes will require for Same
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ışması sorununda bize bildirin.
Oturum durumu için varsayılan sameSite özniteliği, 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.cs, 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 üzeri bir sürüme yükseltildiğinden emin olmalısınız. Ö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 daha sonra başlangıç sınıfınızda CookieManager'ı kullanacak şekilde yapılandırılmalıdır;
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
CookieSameSite = SameSiteMode.None,
CookieHttpOnly = true,
CookieSecure = CookieSecureOption.Always,
CookieManager = new SameSiteCookieManager(new SystemWebCookieManager())
});
}
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 sorunları önlemek için kullanılır.
Ö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.
Yukarıdaki görüntüde, "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 Lax
sahip olduğunu görebilirsiniz.
Denetlemediğiniz tanımlama bilgilerini kesme
.NET 4.5.2, Response.AddOnSendingHeaders
üst bilgilerin yazılmasında araya girilmesine yönelik yeni bir olay kullanıma sunulmuştur. 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ı işleme ve kendi kodunuza kopyalayabileceğiniz tanımlama bilgisi sameSite
özniteliğini ayarlama örneği için olayı bağlama örneği için global.asax ve 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 Lax
None
değerini destekleyen None
tarayıcılarda olarak ayarlar veya desteklemeyen None
tarayıcılarda aynıSite ö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;
}
}
});
}