Wie kann ich das Secure-Flag in einem ASP.NET-Sitzungscookie setzen?

146

Wie kann ich das Secure-Flag in einem ASP.NET-Sitzungscookie setzen, damit es nur über HTTPS und niemals über einfaches HTTP übertragen wird?

Alex
quelle

Antworten:

127

Es gibt zwei Möglichkeiten: Mit einem httpCookiesElement web.configkönnen Sie aktivieren, bei requireSSLdem nur alle Cookies übertragen werden, einschließlich der Sitzung nur in SSL und auch innerhalb der Formularauthentifizierung. Wenn Sie jedoch SSL auf httpcookies aktivieren, müssen Sie es auch innerhalb der Formularkonfiguration aktivieren.

Zur Verdeutlichung bearbeiten: Geben Sie dies ein<system.web>

<httpCookies requireSSL="true" />
Akash Kava
quelle
13
+1 Um dies zu verdeutlichen, sollten Sie dies zur web.config hinzufügen, um das sichere Flag für das Auth-Cookie auf true zu setzen<httpCookies requireSSL="true" />
Tr1stan
8
Beachten Sie, dass dies von Ihrer Konfiguration (auf Serverebene) abhängt. Ich habe die Testregion mit dem Fehler "Die Anwendung ist so konfiguriert, dass sichere Cookies ausgegeben werden. Für diese Cookies muss der Browser die Anforderung über SSL (https-Protokoll) ausgeben. Die aktuelle Anforderung ist jedoch nicht über SSL." Dies lag daran, dass wir einen Reverse-Proxy eingerichtet haben und Browser über SSL eine Verbindung zu diesem herstellen, der Reverse-Proxy zum IIS-Server jedoch über Port 80 liegt, sodass die Anwendung nicht glaubte, dass er gesichert war.
mlhDev
4
@Bargitta Wir haben das Application_PreSendRequestHeaders-Ereignis behandelt. Wenn eine bestimmte Anwendungseinstellung zutrifft, setzen wir alle Cookies auf Sicherheit. Diese App-Einstellung ist nur für unsere externen HTTPS-Sites festgelegt.
mlhDev
Ich verstehe, also wird Ihre gesamte externe Site HTTPS verwenden, danke.
Bargitta
Ich hatte an anderer Stelle gesehen, dass IIS7 system.web durch system.webserver ersetzt wurde, also habe ich versucht, diese Einstellung dort zu platzieren. Unter IIS 8.5 verursachte dies zwar einen Konfigurationsfehler, aber alles funktionierte, wenn ich der Konfigurationsdatei einen Abschnitt system.web hinzufügte und die Einstellung dort einfügte.
Eborbob
180

Fügen Sie im <system.web>Element das folgende Element hinzu:

<httpCookies requireSSL="true" />

Wenn Sie jedoch ein <forms>Element in Ihrem system.web\authenticationBlock haben, überschreibt dies die Einstellung in httpCookiesund setzt sie auf die Standardeinstellung zurück false.

In diesem Fall müssen Sie das requireSSL="true"Attribut auch dem Formularelement hinzufügen .

So werden Sie am Ende mit:

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

Siehe hier und hier für MSDN - Dokumentation dieser Elemente.

Martin Eden
quelle
2
Sie können vermeiden, dass andere web.config-Einstellungen Ihre <httpCookies requireSSL = "true" /> -Einstellung überschreiben, indem Sie das Attribut 'lockItem' einfügen. So: <httpCookies requireSSL = "true" lockItem = "true" />. Weitere Infos hier dotnetnoob.com/2010/11/how-to-secure-aspnet-cookies.html
JTech
1
Wenn ein roleManagerElement vorhanden ist , cookieRequireSSL="true"sollte sein Attribut außerdem auf true gesetzt werden. Ref. msdn.microsoft.com/en-us/library/…
Jeff Mergler
Durch Hinzufügen der obigen Änderungen in verwandten Dateien funktionieren Sitzungsobjekte in meiner Anwendung nicht, sie werden null. Wie kann ich dieses Problem dann beheben?
Satya
Verwenden Sie HTTP oder HTTPS für Ihre App? Das "sichere" Flag, das wir hier setzen, verhindert, dass Cookies über unverschlüsselte (dh HTTP) Verbindungen gesendet werden
Martin Eden
21

Wenn Sie über eingecheckten Code in einer Unternehmensumgebung sprechen, wird es schnell chaotisch. Wir haben festgestellt, dass der beste Ansatz darin besteht, dass web.Release.config Folgendes enthält:

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

Auf diese Weise sind Entwickler nicht betroffen (laufen in Debug), und nur Server, die Release-Builds erhalten, benötigen Cookies, die SSL sein müssen.

Mark D.
quelle
^^^ Das ^^^ ist der Weg. Weitere Informationen zu: Web.Config-Transformationen: go.microsoft.com/fwlink/?LinkId=125889
Jeff Mergler
0

sicher - Dieses Attribut weist den Browser an, das Cookie nur zu senden, wenn die Anforderung über einen sicheren Kanal wie HTTPS gesendet wird. Dies schützt das Cookie vor der Weitergabe unverschlüsselter Anforderungen. Wenn auf die Anwendung sowohl über HTTP als auch über HTTPS zugegriffen werden kann, besteht die Möglichkeit, dass das Cookie im Klartext gesendet wird.

Sanjeev Kumar
quelle
0

Aufbauend auf der Antwort von @Mark D würde ich web.config-Transformationen verwenden, um alle verschiedenen Cookies auf Sicher zu setzen. Dies beinhaltet die Einstellung anonymousIdentification cookieRequireSSLund httpCookies requireSSL.

Zu diesem Zweck würden Sie Ihre web.Release.config wie folgt einrichten:

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

Wenn Sie die Rollen- und Formularauthentifizierung mit ASP.NET Membership Provider(ich weiß, es ist uralt) verwenden, möchten Sie auch die roleManager cookieRequireSSLund die forms requireSSLAttribute als sicher festlegen . In diesem Fall sieht Ihre web.release.config möglicherweise folgendermaßen aus (siehe oben plus neue Tags für die Mitgliedschafts-API):

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

Hintergrundinformationen zu web.config werden hier transformiert: http://go.microsoft.com/fwlink/?LinkId=125889

Dies geht natürlich über die ursprüngliche Frage des OP hinaus. Wenn Sie jedoch nicht alle auf Sicherheit einstellen, können Sie davon ausgehen, dass ein Sicherheitsscan-Tool dies bemerkt und im Bericht rote Fahnen angezeigt werden. Frag mich, woher ich das weiß. :) :)

Jeff Mergler
quelle