Próximas alterações de cookie SameSite no ASP.NET e no ASP.NET Core

SameSite é uma extensão de 2016 para cookies HTTP destinada a mitigar a falsificação de solicitações entre sites (CSRF). O design original era um recurso de aceitação que poderia ser usado adicionando uma nova propriedade SameSite aos cookies. Tinha dois valores, Lax e Strict.

Definir o valor para Lax indica que o cookie deve ser enviado na navegação dentro do mesmo site ou através da navegação GET no seu site a partir de outros sites. Um valor de Strict limitou o cookie a solicitações originadas apenas no mesmo site. A não configuração da propriedade não impôs restrições sobre como o cookie fluía nas solicitações. As operações de autenticação OpenIdConnect (por exemplo, login, logout) e outros recursos que enviam solicitações POST de um site externo para o site que solicita a operação podem usar cookies para correlação e / ou proteção CSRF. Essas operações precisariam desativar o SameSite, não configurando a propriedade, para garantir que esses cookies fossem enviados durante seus fluxos de solicitação especializados.

O Google agora está atualizando o padrão e implementando as alterações propostas em uma próxima versão do Chrome. A alteração adiciona um novo valor SameSite, "Nenhum" e altera o comportamento padrão para "Relaxado". Isso interrompe os logins do OpenIdConnect e, potencialmente, outros recursos em que seu site pode contar, esses recursos terão que usar cookies cuja propriedade SameSite está definida como um valor "Nenhum".

No entanto, navegadores que aderem ao padrão original e não têm conhecimento do novo valor têm um comportamento diferente dos navegadores que usam o novo padrão como o padrão SameSite, afirma que, se um navegador vê um valor para SameSite, ele não entende que deve tratar esse valor como "Estrito". Isso significa que seu site .NET precisará adicionar o sniffing do agente do usuário para decidir se você envia o novo valor Nenhum ou não envia o atributo.



O .NET emitirá atualizações para alterar o comportamento do atributo SameSite no .NET 4.7.2 e no .NET Core 2.1 e superior para refletir a introdução de um novo valor pelo Google. As atualizações para o .NET Framework estarão disponíveis em 19 de novembro como uma atualização opcional via Microsoft Update e WSUS se você usar a funcionalidade "Verificar atualização". Em 10 de dezembro, ele estará amplamente disponível e será exibido no Microsoft Update sem que você precise verificar especificamente se há atualizações. As atualizações do .NET Core estarão disponíveis no .NET Core 3.1 a partir da visualização 1, em novembro.

O .NET Core 3.1 conterá uma definição de enumeração atualizada , SameSite.Unspecified, que não definirá a propriedade SameSite.

O middleware OpenIdConnect para Microsoft.Owin v4.1 e .NET Core será atualizado ao mesmo tempo que suas atualizações do .NET Framework e .NET; no entanto, não podemos introduzir o código sniffing do agente do usuário na estrutura; isso deve ser implementado no seu código do site. A implementação do sniffing de agentes varia de acordo com a versão do ASP.NET ou ASP.NET Core que você está usando e os navegadores que deseja oferecer suporte.

Para o ASP.NET 4.7.2 com Microsoft.Owin 4.1.0, o sniffing de agente pode ser implementado usando o ICookieManager ;

public class SameSiteCookieManager : ICookieManager { private readonly ICookieManager _innerManager; public SameSiteCookieManager() : this(new CookieManager()) { } public SameSiteCookieManager(ICookieManager innerManager) { _innerManager = innerManager; } public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options) { CheckSameSite(context, options); _innerManager.AppendResponseCookie(context, key, value, options); } public void DeleteCookie(IOwinContext context, string key, CookieOptions options) { CheckSameSite(context, options); _innerManager.DeleteCookie(context, key, options); } public string GetRequestCookie(IOwinContext context, string key) { return _innerManager.GetRequestCookie(context, key); } private void CheckSameSite(IOwinContext context, CookieOptions options) { if (DisallowsSameSiteNone(context) && options.SameSite == SameSiteMode.None) { options.SameSite = null; } } public static bool DisallowsSameSiteNone(IOwinContext context) { // TODO: Use your User Agent library of choice here. var userAgent = context.Request.Headers["User-Agent"]; return userAgent.Contains("BrokenUserAgent") || userAgent.Contains("BrokenUserAgent2") } } 

E, em seguida, defina as configurações do OpenIdConnect para usar o novo CookieManager;

 app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { // … Your preexisting options … CookieManager = new SameSiteCookieManager(new SystemWebCookieManager()) }); 

O SystemWebCookieManager precisará do patch .NET 4.7.2 ou posterior do SameSite instalado para funcionar corretamente.

Para o ASP.NET Core, você deve instalar os patches e implementar o código de detecção do agente em uma política de cookies . Para versões anteriores à 3.1, substitua SameSiteMode.Unspecified por (SameSiteMode) (- 1).

 private void CheckSameSite(HttpContext httpContext, CookieOptions options) { if (options.SameSite > SameSiteMode.Unspecified) { var userAgent = httpContext.Request.Headers["User-Agent"].ToString(); // TODO: Use your User Agent library of choice here. if (/* UserAgent doesn't support new behavior */) { // For .NET Core < 3.1 set SameSite = -1 options.SameSite = SameSiteMode.Unspecified; } } } public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { options.MinimumSameSitePolicy = SameSiteMode.Unspecified; options.OnAppendCookie = cookieContext => CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); options.OnDeleteCookie = cookieContext => CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); }); } public void Configure(IApplicationBuilder app) { app.UseCookiePolicy(); // Before UseAuthentication or anything else that writes cookies. app.UseAuthentication(); // … } 

Em teste com a equipe do Azure Active Directory, descobrimos que as seguintes verificações funcionam para todos os agentes de usuário comuns que o Azure Active Directory vê que não entendem o novo valor.

 public static bool DisallowsSameSiteNone(string userAgent) {    // Cover all iOS based browsers here. This includes:    // - Safari on iOS 12 for iPhone, iPod Touch, iPad    // - WkWebview on iOS 12 for iPhone, iPod Touch, iPad    // - Chrome on iOS 12 for iPhone, iPod Touch, iPad    // All of which are broken by SameSite=None, because they use the iOS networking stack    if (userAgent.Contains("CPU iPhone OS 12") || userAgent.Contains("iPad; CPU OS 12"))    {        return true;    }    // Cover Mac OS X based browsers that use the Mac OS networking stack. This includes:    // - Safari on Mac OS X.    // This does not include:    // - Chrome on Mac OS X    // Because they do not use the Mac OS networking stack.    if (userAgent.Contains("Macintosh; Intel Mac OS X 10_14") && userAgent.Contains("Version/") && userAgent.Contains("Safari"))    {        return true;    }    // Cover Chrome 50-69, because some versions are broken by SameSite=None, // and none in this range require it.    // Note: this covers some pre-Chromium Edge versions, // but pre-Chromium Edge does not require SameSite=None.    if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6"))    {        return true;    }    return false; } 

Essa lista de navegadores não é de modo algum canônica e você deve validar se os navegadores comuns e outros agentes de usuário suportados pelo seu sistema se comportam conforme o esperado quando a atualização é implementada.

O Chrome 80 está programado para ativar o novo comportamento em fevereiro ou março de 2020, incluindo uma atenuação temporária adicionada no Chrome 79 Beta. Se você deseja testar o novo comportamento sem a atenuação, use o Chromium 76. As versões mais antigas do Chromium estão disponíveis para download .

Se você não conseguir atualizar as versões da estrutura no momento em que o Chrome ativar o novo comportamento no início de 2020, poderá alterar o fluxo OpenIdConnect para um fluxo de código, em vez do fluxo implícito padrão que o ASP.NET e o ASP.NET Core usam, mas isso deve ser visto como uma medida temporária.


Recomendamos que você baixe as versões atualizadas do .NET Framework e .NET Core quando elas estiverem disponíveis em novembro e comece a planejar sua atualização antes que as alterações do Chrome sejam lançadas.

Source: https://habr.com/ru/post/pt473142/


All Articles