como o atributo SameSite foi adicionado automaticamente ao meu cookie Asp.net_SessionID?

20

Recentemente samesite = lax adiciona automaticamente ao meu cookie de sessão! esse atributo basta adicionar ao sessionID: "Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"

Meu site hospedado no IIS 8.5, Windows 2012 R2 e não possui WAF ou UrlRewrite e desativo o AntiVirus (kasper).

mas ainda tem o mesmo problema em alguns servidores do cliente.

qualquer ideia?

EDITADO: Encontre o seguinte: https://support.microsoft.com/en-us/help/4524419/kb4524419

Agora, o ASP.NET emitirá um cabeçalho de cookie SameSite quando o valor HttpCookie.SameSite for 'None' para acomodar as próximas alterações na manipulação de cookies SameSite no Chrome. Como parte dessa alteração, os cookies FormsAuth e SessionState também serão emitidos com SameSite = 'Lax' em vez do padrão anterior de 'None', embora esses valores possam ser substituídos no web.config.

Como substituir os cookies do mesmo site para o SessionState no web.config? eu adiciono esta linha, mas não funciona no cookie SessionID! <httpCookies sameSite="Unspecified" />

EDITADO: Acho isso: https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSite

Defina samesite para stateserver pelo atributo "cookieSameSite" da tag SessionState.

Sadegh
fonte
Você tem resolvê-lo adicionando “<sessionstate CookieSameSite" Eu tenho 4.8 instalado, mas quando eu acessar a seção sessionstate de gerente de IIS Eu só recebem despercebidas atributo?..
Jokies Ding
11
Eu recebo a mesma mensagem no iis, mas funciona e altera o valor do mesmo site no horário do conjunto de cookies. eu adiciono cookieSameSite = "None" ao meu web.config para obter a versão anterior. observe que cookieSameSite é caseSesitive.
Sadegh
Eu apenas tive que corrigir um site legado 4.5.2 para isso - o SameSite não era suportado pelas configurações, então tive que interceptar o cookie no Session_Start e reescrevê-lo diretamente com "SameSite = None; Secure" adicionado.
ParanoidCoder
@ParanoidCoder tanque você para sua sugestão, eu uso .net 4.6.1 e funciona para mim. Mas eu tenho uma pergunta sobre sua solução: você usa a reescrita de URL (extensão do IIS) ou reescreve-a por código no Session_Start, pode me mostrar seu código?
Sadegh 6/04

Respostas:

19

Adicione essas opções ao web.config para sameSite = None, Lax ou Strict

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" />
    </authentication>
HJ van der Wijk
fonte
11
<httpCookies sameSitenão é mostrado como uma opção válida no .Net Framework 4.8
IronSean
Funciona para o framework 4.6.1?
Ankush Jain 20/02
@AnkushJain, não, é suportado desde o .NET Framework 4.7.2.
Vasiliy Zverev
11

Não consigo reescrever, porque o UrlRewrite não está instalado em todos os servidores de meus clientes.

Finalmente eu adiciono cookieSameSite ao meu web.config:

<sessionState mode="StateServer" cookieSameSite="None" sqlConnectionString="data source=(local);user id=sa;password=" cookieless="false" timeout="20" />

Sadegh
fonte
2
só funciona após .net 4.7.2
mrlayeghi 27/01
11
Eu o uso no .net 4.6.1 e funciona bem.
Sadegh 28/01
Sinto muito @ Sadegh.K, mas não funcionará antes da versão
cederlof
@cederlof eu encontrei este: support.microsoft.com/en-us/help/4533011/kb4533011
Sadegh
@ Sadegh Certo, mas isso não adiciona a cookieSameSitefuncionalidade ao web.config - o .NET 4.7.2 faz. O link que eu publiquei no meu comentário também está vinculado na página a que você se refere.
cederlof 6/04
8

O atributo CookieSameSite não está disponível para muitas estruturas mais antigas. Se você estiver na situação em que a resposta aceita não é suportada em seu ambiente, continue lendo!

Eu modifiquei várias respostas do SO para criar essa reescrita de URL que adiciona SameSite=Noneaos cookies de sessão e também remover SameSite=Nonede todas cookies da maioria dos navegadores incompatíveis. O objetivo dessa reescrita é preservar o comportamento "legado" anterior ao Chrome 80.

Artigo completo no meu blog Coder Frontline :

<rewrite>
  <outboundRules>
    <preConditions>
      <!-- Checks User Agent to identify browsers incompatible with SameSite=None -->
      <preCondition name="IncompatibleWithSameSiteNone" logicalGrouping="MatchAny">
        <add input="{HTTP_USER_AGENT}" pattern="(CPU iPhone OS 12)|(iPad; CPU OS 12)" />
        <add input="{HTTP_USER_AGENT}" pattern="(Chrome/5)|(Chrome/6)" />
        <add input="{HTTP_USER_AGENT}" pattern="( OS X 10_14).*(Version/).*((Safari)|(KHTML, like Gecko)$)" />
      </preCondition>
    </preConditions>

    <!-- Adds or changes SameSite to None for the session cookie -->
    <!-- Note that secure header is also required by Chrome and should not be added here -->
    <rule name="SessionCookieAddNoneHeader">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*ASP.NET_SessionId.*)" />
      <!-- Use this regex if your OS/framework/app adds SameSite=Lax automatically to the end of the cookie -->
      <!-- <match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)" /> -->
      <action type="Rewrite" value="{R:1}; SameSite=None" />
    </rule>

    <!-- Removes SameSite=None header from all cookies, for most incompatible browsers -->
    <rule name="CookieRemoveSameSiteNone" preCondition="IncompatibleWithSameSiteNone">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=None)" />
      <action type="Rewrite" value="{R:1}" />
    </rule>
  </outboundRules>
</rewrite>

Isso deve funcionar para a maioria dos aplicativos ASP .Net e ASP .Net Core, embora as Estruturas mais recentes possuam código e opções de configuração adequadas para permitir que você controle esse comportamento. Eu recomendaria pesquisar todas as opções disponíveis antes de usar minha reescrita acima.

zemien
fonte
Onde você coloca isso no MVC 5? Em <system.net></system.net>?
Joel Wiklund
In<system.webServer>
zemien 13/03
Nota: se o cookie ASP.NET_SessionId já tiver SameSite=Laxisso, ele será anexado apenas SameSite=Nonee não será substituído.
cederlof 6/04
@ zemien Eu não entendo por que (SameSite=.*)?o padrão está em tudo?
cederlof 6/04
11
@cederlof você está certo! Não testei meu regex corretamente porque meu ambiente era uma estrutura .Net mais antiga que não adicionava a propriedade Lax automaticamente. No seu caso, você pode usar um regex diferente para excluir o SameSite=Laxcabeçalho: ((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)consulte regex101.com/r/7D9UdO/3 atualizado - no entanto, observe que esse regex excluirá tudo o que desejar posteriormente, como o cabeçalho seguro. Essa deve ser uma condição rara, portanto, o ponto principal é ver o que o seu aplicativo OS + framework + está emitindo e escrever a regex conforme a sua necessidade. Vou atualizar minha resposta para refletir os dois lados :)
zemien 08/04
7

Última atualização: resposta de zemien é mais abrangente e completa que a minha. porque define o cookie com base no agente do usuário.

Minha resposta:

Você pode substituir SameSite = Lax por SameSite = None para ASP.NET_SessionId no web.config da seguinte maneira:

<rewrite>
  <outboundRules>
    <rule name="AddSameSiteCookieFlag">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASP.NET_SessionId)(=.*))(SameSite=Lax)" />
      <action type="Rewrite" value="{R:1};SameSite=None" />
    </rule>
  </outboundRules>
</rewrite>

Atualização: Para evitar problemas no IOS , substitua

<action type="Rewrite" value="{R:1};SameSite=None" />

com

<action type="Rewrite" value="{R:1};" />
Mohammad Reza Sadreddini
fonte
2
Isso é possível apenas se o módulo de reescrita do IIS estiver instalado no servidor
Vincent Ducroquet
11
O seu problema de atualização para iOS também causará problemas em sistemas operacionais mais recentes. Basicamente, alguns navegadores / SO atribuirão SameSite = Lax se estiver faltando o cabeçalho SameSite. Acredito que a única maneira é cheirar o UserAgent e decidir se deve incluir o cabeçalho ou não. Ainda estou pesquisando se isso pode ser feito via web.config ou se é necessário incluir uma alteração de código no Session_Start.
zemien 22/02
Apenas para destacar o que o @zemien escreve, a atualização do iOS corrige um problema, mas apresenta outro.
cederlof 01/04
3

@zemien sua solução resolveu corretamente nossos problemas do google chrome

Temos uma integração em que nosso aplicativo é incorporado em um iframe de terceiros. A versão 80 do Chrome, lançada em 4 de fevereiro de 2020, impedia o carregamento de cookies.

No entanto, tive que modificar o padrão para capturar todos os cookies, adicionar o sinalizador Seguro e condição para não aplicar a reescrita no host local para o nosso ambiente local não https

<rule name="SessionCookieAddNoneHeader">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=.*)?" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
      <action type="Rewrite" value="{R:1}; SameSite=None; Secure" />
</rule>
C Rudolph
fonte
1

Funciona para mim. Adicionado ao meu arquivo web.config:

<sessionState cookieSameSite="None"></sessionState>

Atualize para o patch de instalação do .Net Framework 4.8 +: atualização cumulativa de 2019-12 para .NET Framework 3.5 e 4.8 para Windows 10 versão 1909 para x64 (KB4533002)

Stéphane
fonte