Пример файла cookie SameSite для ASP.NET 4.7.2 VB MVC
платформа .NET Framework 4.7 имеет встроенную поддержку атрибута SameSite, но соответствует исходному стандарту.
Исправленное поведение изменило значение SameSite.None
, чтобы выдавать атрибут со значением None
, а не вообще не выдавать значение. Если вы хотите не выдавать значение , можно задать SameSite
для свойства файла cookie значение -1.
Запись атрибута SameSite
Ниже приведен пример записи атрибута SameSite в файл cookie.
' 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)
Если вы читаете это на языке, отличном от английского, сообщите нам об этом в этой проблеме обсуждения GitHub , если вы хотите видеть комментарии к коду на своем родном языке.
Атрибут sameSite по умолчанию для состояния сеанса задается в параметре cookieSameSite параметров сеанса в web.config
<system.web>
<sessionState cookieSameSite="None">
</sessionState>
</system.web>
Проверка подлинности MVC
Для проверки подлинности на основе файлов cookie OWIN MVC используется диспетчер файлов cookie для изменения атрибутов файлов cookie. SameSiteCookieManager.vb — это реализация такого класса, которую можно скопировать в собственные проекты.
Необходимо убедиться, что все компоненты Microsoft.Owin обновлены до версии 4.1.0 или более поздней. Проверьте файл packages.config
, чтобы убедиться, что все номера версий совпадают, например.
<?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>
Компоненты проверки подлинности должны быть настроены для использования CookieManager в классе запуска;
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
Диспетчер файлов cookie должен быть задан для каждого компонента, который его поддерживает, включая CookieAuthentication и OpenIdConnectAuthentication.
SystemWebCookieManager используется, чтобы избежать известных проблем с интеграцией файлов cookie ответа.
Выполнение примера
Если вы запускаете пример проекта, загрузите отладчик браузера на начальной странице и используйте его для просмотра коллекции файлов cookie для сайта.
Для этого в Edge и Chrome нажмите вкладку F12
Application
и щелкните URL-адрес сайта под параметром Cookies
Storage
в разделе .
На приведенном выше изображении видно, что файл cookie, созданный примером, при нажатии кнопки "Создать файл cookie SameSite" имеет значение атрибута Lax
SameSite , соответствующее значению, заданному в примере кода.
Перехват файлов cookie, которые вы не контролируете
В .NET 4.5.2 появилось новое событие для перехвата записи заголовков. Response.AddOnSendingHeaders
Это можно использовать для перехвата файлов cookie перед их возвратом на клиентский компьютер. В примере мы связаем событие со статическим методом, который проверяет, поддерживает ли браузер новые изменения sameSite, и, если нет, изменяет файлы cookie, чтобы не выдавать атрибут, если новое None
значение было задано.
Пример подключения события см . в статье global.asax , а в разделе SameSiteCookieRewriter.vb — пример обработки события и настройки атрибута cookie sameSite
, который можно скопировать в собственный код.
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
Вы можете изменить определенное поведение именованных файлов cookie практически таким же образом; Приведенный ниже пример настраивает файл cookie проверки подлинности по умолчанию с Lax
на None
в браузерах, поддерживающих None
значение , или удаляет атрибут sameSite в браузерах, которые не поддерживают None
.
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
Дополнительные сведения
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по