Amostra de cookie SameSite para ASP.NET WebForms de VB 4.7.2
.NET Framework 4.7 tem suporte interno para o atributo SameSite, mas segue o padrão original.
O comportamento corrigido alterou o significado de SameSite.None
para emitir o atributo com um valor de , em vez de None
não emitir o valor. Se você não quiser emitir o valor, poderá definir a SameSite
propriedade em um cookie como -1.
Veja a seguir um exemplo de como escrever um atributo SameSite em um 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)
Se você estiver lendo isso em um idioma diferente do inglês, informe-nos neste problema de discussão do GitHub se quiser ver os comentários de código em seu idioma nativo.
O atributo sameSite padrão para um cookie de autenticação de formulários é definido no cookieSameSite
parâmetro das configurações de autenticação de formulários em web.config
<system.web>
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="~/" cookieSameSite="None" requireSSL="true">
</forms>
</authentication>
</system.web>
O atributo sameSite padrão para o estado de sessão também é definido no parâmetro 'cookieSameSite' das configurações de sessão em web.config
<system.web>
<sessionState cookieSameSite="None">
</sessionState>
</system.web>
A atualização de novembro de 2019 para .NET alterou as configurações padrão de Autenticação e Sessão de Formulários para lax
como é a configuração mais compatível, no entanto, se você inserir páginas em iframes, talvez seja necessário reverter essa configuração como Nenhum e, em seguida, adicionar o código de interceptação mostrado abaixo para ajustar o none
comportamento dependendo da funcionalidade do navegador.
Se você executar o projeto de exemplo, carregue o depurador do navegador na página inicial e use-o para exibir a coleção de cookies do site.
Para fazer isso no Edge e no Chrome, pressione F12
e selecione a Application
guia e clique na URL do site na opção Cookies
na Storage
seção .
Você pode ver na imagem acima que o cookie criado pelo exemplo quando você clica no botão "Criar Cookies" tem um valor de atributo SameSite igual Lax
ao valor definido no código de exemplo.
O .NET 4.5.2 introduziu um novo evento para interceptar a gravação de cabeçalhos, Response.AddOnSendingHeaders
. Isso pode ser usado para interceptar cookies antes que eles sejam retornados ao computador cliente. No exemplo, conectamos o evento a um método estático que verifica se o navegador dá suporte às novas alterações sameSite e, caso contrário, altera os cookies para não emitir o atributo se o novo None
valor tiver sido definido.
Consulte global.asax para obter um exemplo de como conectar o evento e SameSiteCookieRewriter.cs para obter um exemplo de como manipular o evento e ajustar o atributo 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
Você pode alterar o comportamento de cookie nomeado específico da mesma maneira; o exemplo abaixo ajusta o cookie de autenticação padrão de Lax
para None
em navegadores que dão suporte ao None
valor ou remove o atributo sameSite em navegadores que não dão suporte None
a .
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