Comment puis-je définir l'indicateur sécurisé sur un cookie de session ASP.NET?

146

Comment puis-je définir l'indicateur Secure sur un cookie de session ASP.NET, de sorte qu'il ne soit transmis que via HTTPS et jamais via HTTP standard?

Alex
la source

Réponses:

127

Il y a deux façons, un httpCookiesélément dans web.configvous permet d'activer requireSSLqui ne transmet que tous les cookies, y compris la session en SSL uniquement et également l'authentification par formulaire à l'intérieur, mais si vous activez SSL sur httpcookies, vous devez également l'activer dans la configuration des formulaires.

Modifier pour plus de clarté: mettez ceci dans<system.web>

<httpCookies requireSSL="true" />
Akash Kava
la source
13
+1 Pour clarifier, voici ce que vous devez ajouter au web.config pour définir l'indicateur de sécurité du cookie d'authentification sur true<httpCookies requireSSL="true" />
Tr1stan
8
Notez que cela dépend de votre configuration (au niveau du serveur). J'ai mis la région de test en panne avec l'erreur "L'application est configurée pour émettre des cookies sécurisés. Ces cookies nécessitent que le navigateur émette la requête via SSL (protocole https). Cependant, la requête actuelle ne passe pas par SSL." En effet, nous avons un proxy inverse en place et les navigateurs s'y connectent via SSL, mais le proxy inverse vers le serveur IIS est sur le port 80, donc l'application ne pensait pas qu'il était sécurisé.
mlhDev
4
@Bargitta Nous avons géré l'événement Application_PreSendRequestHeaders et si un certain paramètre d'application est vrai, nous définissons tous les cookies pour qu'ils soient sécurisés. Ce paramètre d'application n'est défini que pour nos sites externes HTTPS.
mlhDev
Je vois, donc tout votre site externe utilisera HTTPS, merci.
Bargitta
J'avais vu ailleurs qu'après que IIS7 system.web avait été remplacé par system.webserver, j'ai donc essayé de mettre ce paramètre là. Sur IIS 8.5, cela provoquait une erreur de configuration, mais tout fonctionnait si j'ajoutais une section system.web au fichier de configuration et y mettais le paramètre.
Eborbob
181

Dans l' <system.web>élément, ajoutez l'élément suivant:

<httpCookies requireSSL="true" />

Cependant, si vous avez un <forms>élément dans votre system.web\authenticationbloc, cela remplacera le paramètre dans httpCookies, le réinitialisant à la valeur par défaut false.

Dans ce cas, vous devez également ajouter l' requireSSL="true"attribut à l'élément forms.

Vous vous retrouverez donc avec:

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

Voir ici et ici pour la documentation MSDN de ces éléments.

Martin Eden
la source
2
Vous pouvez éviter que d'autres paramètres web.config ne remplacent votre paramètre <httpCookies requireSSL = "true" /> en incluant l'attribut 'lockItem'. Comme ceci: <httpCookies requireSSL = "true" lockItem = "true" />. Plus d'infos ici dotnetnoob.com/2010/11/how-to-secure-aspnet-cookies.html
JTech
1
En outre, s'il existe un roleManagerélément, son attribut cookieRequireSSL="true"doit également être défini sur true. Réf. msdn.microsoft.com/en-us/library/…
Jeff Mergler
en ajoutant les modifications ci-dessus dans les fichiers associés, les objets de session ne fonctionnent pas dans mon application, ils deviennent nuls. comment puis-je rectifier ce problème alors?
satya
Utilisez-vous HTTP ou HTTPS pour votre application? L'indicateur "sécurisé" que nous définissons ici empêche l'envoi de cookies via des connexions non cryptées (c'est-à-dire HTTP)
Martin Eden
21

Les choses se compliquent rapidement si vous parlez de code enregistré dans un environnement d'entreprise. Nous avons constaté que la meilleure approche consiste à faire en sorte que le fichier web.Release.config contienne les éléments suivants:

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

De cette façon, les développeurs ne sont pas affectés (s'exécutant dans Debug), et seuls les serveurs qui obtiennent des versions Release exigent que les cookies soient SSL.

Mark D
la source
^^^ Ceci ^^^ est le chemin. Plus d'informations sur les transformations de Web.Config: go.microsoft.com/fwlink/?LinkId=125889
Jeff Mergler
0

secure - Cet attribut indique au navigateur d'envoyer le cookie uniquement si la demande est envoyée via un canal sécurisé tel que HTTPS. Cela aidera à empêcher le cookie d'être transmis sur des demandes non chiffrées. Si l'application est accessible via HTTP et HTTPS, il est possible que le cookie puisse être envoyé en texte clair.

Sanjeev Kumar
la source
0

En me basant sur la réponse de @Mark D, j'utiliserais les transformations web.config pour définir tous les différents cookies sur Secure. Cela inclut le réglage anonymousIdentification cookieRequireSSLet httpCookies requireSSL.

À cette fin, vous configurez votre web.Release.config comme:

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

Si vous utilisez l'authentification des rôles et des formulaires avec ASP.NET Membership Provider(je sais, c'est ancien), vous voudrez également définir roleManager cookieRequireSSLles forms requireSSLattributs et comme sécurisés. Si tel est le cas, votre web.release.config pourrait ressembler à ceci (inclus ci-dessus plus de nouvelles balises pour l'API d'adhésion):

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

Informations générales sur web.config se transforme ici: http://go.microsoft.com/fwlink/?LinkId=125889

Évidemment, cela va au-delà de la question initiale de l'OP, mais si vous ne les configurez pas tous pour sécuriser, vous pouvez vous attendre à ce qu'un outil d'analyse de sécurité le remarque et vous verrez des drapeaux rouges apparaître sur le rapport. Demandez-moi comment je sais. :)

Jeff Mergler
la source