Amostra de cookie SameSite para ASP.NET MVC 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 Nonenão emitir o valor. Se você não quiser emitir o valor, poderá definir a SameSite propriedade em um cookie como -1.

Gravando o atributo SameSite

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 o estado da sessão é definido no parâmetro 'cookieSameSite' das configurações de sessão em web.config

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

Autenticação MVC

A autenticação baseada em cookie OWIN MVC usa um gerenciador de cookies para habilitar a alteração de atributos de cookie. O SameSiteCookieManager.vb é uma implementação dessa classe que você pode copiar para seus próprios projetos.

Você deve garantir que os componentes do Microsoft.Owin sejam atualizados para a versão 4.1.0 ou superior. Verifique o packages.config arquivo para garantir que todos os números de versão correspondam, por exemplo.

<?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>

Os componentes de autenticação devem ser configurados para usar o CookieManager em sua classe de inicialização;

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

Um gerenciador de cookies deve ser definido em cada componente que dá suporte a ele, incluindo CookieAuthentication e OpenIdConnectAuthentication.

O SystemWebCookieManager é usado para evitar problemas conhecidos com a integração de cookie de resposta.

Executando o exemplo

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 a Application guia e clique na URL do site na opção Cookies na Storage seção .

Lista de Cookies do Depurador do Navegador

Você pode ver na imagem acima que o cookie criado pelo exemplo quando você clica no botão "Criar Cookie sameSite" tem um valor de atributo SameSite de Lax, correspondendo ao valor definido no código de exemplo.

Interceptando cookies que você não controla

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 para o 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.vb para obter um exemplo de manipulação do evento e ajuste do atributo de cookie sameSite que você pode copiar em seu próprio código.

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 específico do cookie nomeado 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 mesmo atributoSite em navegadores que não dão suporte Nonea .

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

Mais informações

Chrome Atualizações

Documentação do OWIN SameSite

Documentação do ASP.NET

Patches sameSite do .NET