Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O .NET Framework 4.7 tem suporte incorporado para o atributo SameSite , mas cumpre o padrão original.
O comportamento corrigido alterou o significado de SameSite.None para emitir o atributo com um valor de None, em vez de não emitir o valor de forma alguma. Se quiseres não emitir o valor, podes definir a SameSite propriedade de um cookie para -1.
Escrever o atributo SameSite
Segue-se um exemplo de como escrever um atributo SameSite num 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);
Se estiver a ler isto numa língua diferente do inglês, diga-nos nesta edição de discussão do GitHub se quiser ver os comentários do código na sua língua nativa.
O atributo sameSite por defeito para um cookie de autenticação de formulários está definido no parâmetro cookieSameSite das definiçõ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 predefinido sameSite para o estado da sessão também está definido no parâmetro 'cookieSameSite' das definições da sessão em web.config
<system.web>
<sessionState cookieSameSite="None">
</sessionState>
</system.web>
A atualização de novembro de 2019 para o .NET alterou as definições predefinidas para Autenticação e Sessão de Formulários para lax como é a configuração mais compatível, no entanto, se incorporar páginas em iframes, pode ser necessário reverter essa definição para Nenhuma e depois adicionar o código de interceção mostrado abaixo para ajustar o none comportamento consoante a capacidade do navegador.
Executando o exemplo
Se executares o projeto de exemplo, carrega o depurador do navegador na página inicial e usa-o para visualizar a coleção de cookies do site.
Para o fazer no Edge e no Chrome, pressione F12 e, em seguida, selecione o separador Application e clique no URL do site na opção Cookies na secção Storage.
Pode ver na imagem acima que o cookie criado pela amostra ao clicar no botão "Criar Cookies" tem um valor de atributo SameSite de Lax, correspondente ao conjunto de valores no código de exemplo.
Intercetação de cookies que não controla
.NET 4.5.2 introduziu um novo evento para intercetar a escrita de cabeçalhos, Response.AddOnSendingHeaders. Isto pode ser usado para intercetar cookies antes de serem devolvidos à máquina cliente. No exemplo, ligamos o evento a um método estático que verifica se o navegador suporta as novas alterações do sameSite e, se não, alteramos os cookies para não emitirem o atributo caso o novo None valor tenha sido definido.
Veja global.asax para um exemplo de como ligar o evento e SameSiteCookieRewriter.cs para um exemplo de como gerir o evento e ajustar o atributo do cookie sameSite .
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
}
}
});
}
}
}
Pode alterar o comportamento de cookies nomeados de forma muito semelhante; o exemplo abaixo ajusta o cookie de autenticação predefinido de Lax para None nos navegadores que suportam o None valor, ou remove o atributo sameSite em navegadores que não suportam 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;
}
}
});
}