Como posso definir o sinalizador seguro em um cookie de sessão do ASP.NET?

146

Como posso definir o sinalizador seguro em um cookie de sessão do ASP.NET, para que ele seja transmitido apenas por HTTPS e nunca por HTTP simples?

Alex
fonte

Respostas:

127

Há duas maneiras: um httpCookieselemento web.configpermite ativar a requireSSLtransmissão de todos os cookies, incluindo apenas a sessão SSL e também a autenticação de formulários, mas se você ativar o SSL em httpcookies, também deverá ativá-lo na configuração de formulários.

Editar para maior clareza: coloque isso em<system.web>

<httpCookies requireSSL="true" />
Akash Kava
fonte
13
+1 Para esclarecer, este é o que você deve adicionar à web.config para definir o sinalizador seguro no cookie de autenticação para true<httpCookies requireSSL="true" />
Tr1stan
8
Observe que isso depende da sua configuração (no nível do servidor). Desativei a região de teste com o erro "O aplicativo está configurado para emitir cookies seguros. Esses cookies exigem que o navegador emita a solicitação por SSL (protocolo https). No entanto, a solicitação atual não é por SSL". Isso ocorre porque temos um proxy reverso instalado e os navegadores se conectam a ele via SSL, mas o proxy reverso para o servidor IIS está na porta 80, portanto, o aplicativo não achou que estava seguro.
precisa saber é
4
@Bargitta Lidamos com o evento Application_PreSendRequestHeaders e, se uma determinada configuração de aplicativo for verdadeira, definiremos todos os cookies para proteger. Esta configuração de aplicativo é definida apenas para nossos sites externos HTTPS.
MlhDev 25/11
Entendo, então todo o seu site externo usará HTTPS, obrigado.
Bargitta # 26/15
Eu já havia visto em outro lugar que após o IIS7 system.web ter sido substituído pelo system.webserver, tentei colocar essa configuração lá. No IIS 8.5, isso causou um erro de configuração, mas tudo funcionou se eu adicionasse uma seção system.web ao arquivo de configuração e colocasse a configuração lá.
Eborbob
181

No <system.web>elemento, adicione o seguinte elemento:

<httpCookies requireSSL="true" />

No entanto, se você tiver um <forms>elemento em seu system.web\authenticationbloco, isso substituirá a configuração httpCookies, retornando-a ao padrão false.

Nesse caso, você precisa adicionar o requireSSL="true"atributo também ao elemento forms.

Então você vai acabar com:

<system.web>
    <authentication mode="Forms">
        <forms requireSSL="true">
            <!-- forms content -->
        </forms>
    </authentication>
</system.web>

Veja aqui e aqui a documentação do MSDN desses elementos.

Martin Eden
fonte
2
Você pode evitar que outras configurações do web.config substituam sua configuração <httpCookies requireSSL = "true" /> incluindo o atributo 'lockItem'. Assim: <httpCookies requireSSL = "true" lockItem = "true" />. Mais informações aqui dotnetnoob.com/2010/11/how-to-secure-aspnet-cookies.html
JTech
1
Além disso, se houver um roleManagerelemento, seu atributo cookieRequireSSL="true"também deverá ser definido como true. Ref. msdn.microsoft.com/en-us/library/…
Jeff Mergler
adicionando as alterações acima nos arquivos relacionados, os objetos da sessão não estão funcionando no meu aplicativo, estão se tornando nulos. como posso corrigir esse problema então?
satya 03/02
Você está usando HTTP ou HTTPS para seu aplicativo? O sinalizador "seguro" que definimos aqui impede que os cookies sejam enviados por conexões não criptografadas (ou seja, HTTP)
Martin Eden
21

As coisas ficam confusas rapidamente se você está falando sobre código de check-in em um ambiente corporativo. Descobrimos que a melhor abordagem é fazer com que o web.Release.config contenha o seguinte:

<system.web>
  <compilation xdt:Transform="RemoveAttributes(debug)" />
  <authentication>
      <forms xdt:Transform="Replace" timeout="20" requireSSL="true" />
  </authentication>
</system.web>

Dessa forma, os desenvolvedores não são afetados (em execução no Debug) e apenas os servidores que obtêm versões do Release exigem que os cookies sejam SSL.

Mark D
fonte
^^^ Este ^^^ é o caminho. Mais informações em: Web.Config transforma: go.microsoft.com/fwlink/?LinkId=125889
Jeff Mergler
0

secure - Este atributo diz ao navegador para enviar o cookie apenas se a solicitação estiver sendo enviada por um canal seguro, como HTTPS. Isso ajudará a proteger o cookie de não passar por solicitações não criptografadas. Se o aplicativo puder ser acessado por HTTP e HTTPS, é possível que o cookie possa ser enviado em texto não criptografado.

Sanjeev Kumar
fonte
0

Com base na resposta do @Mark D, eu usaria as transformações web.config para definir todos os vários cookies como Secure. Isso inclui a configuração anonymousIdentification cookieRequireSSLe httpCookies requireSSL.

Para esse fim, você configuraria seu web.Release.config como:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web>
    <httpCookies xdt:Transform="SetAttributes(httpOnlyCookies)" httpOnlyCookies="true" />
    <httpCookies xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    <anonymousIdentification xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" /> 
  </system.web>
</configuration>

Se você estiver usando Autenticação de Funções e Formulários com o ASP.NET Membership Provider(eu sei, é antigo), também desejará definir roleManager cookieRequireSSLos forms requireSSLatributos e também como seguros. Nesse caso, seu web.release.config pode ficar assim (incluído acima, mais novas tags para a API de associação):

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web>
    <httpCookies xdt:Transform="SetAttributes(httpOnlyCookies)" httpOnlyCookies="true" />
    <httpCookies xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    <anonymousIdentification xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" /> 
    <roleManager xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" />
    <authentication>
        <forms xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    </authentication>
  </system.web>
</configuration>

O histórico do web.config se transforma aqui: http://go.microsoft.com/fwlink/?LinkId=125889

Obviamente, isso vai além da questão original do OP, mas se você não definir todos eles para garantir, pode esperar que uma ferramenta de verificação de segurança seja notada e você verá sinais vermelhos no relatório. Me pergunte como eu sei. :)

Jeff Mergler
fonte