2015-09-16 17 views
6

Ho impostato il seguente nel file web.config:Come posso impostare il flag "sicuro" per i cookie in un sito Web ASP.NET MVC?

<system.web> 
    <httpCookies httpOnlyCookies="true" requireSSL="true" /> 
</system.web> 

Quando mi ha colpito il sito web utilizzando una connessione HTTP, che reindirizza alla mia pagina di login (specificando il regime, come HTTPS). Quando il browser preleva questa pagina, la risposta fissa alcuni biscotti (il cookie di sessione ASP.NET, e la verifica di token di richiesta per il mio modulo di accesso):

Set-Cookie: __RequestVerificationToken = IHx8a2zQU374d5CtsoEVW ... YtIc1; percorso = /; HttpOnly Set-Cookie: ASP.NET_SessionId = pfbkkxx2seqhdrxxiodxfbmh; percorso = /; HttpOnly

Questi hanno la bandiera HttpOnly, che è buono - ma non hanno la bandiera secure come descritto here on Wikipedia.

Se dunque io il login, viene creato un cookie di autenticazione, e questo fa avere il set secure bandiera:

Set-Cookie: MyWebSite.Authentication = RE3UD ... BDW4; percorso = /; protetto; HttpOnly

Come posso garantire che il flag secure si trova su tutti i miei biscotti?


UPDATE: come richiesto, questo è l'uscita cURL ottengo (quando va a prendere direttamente la pagina di login):

curl https://www.mywebsite.com/Account/Login --verbose --insecure 

dà:

% Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
    0  0 0  0 0  0  0  0 --:--:-- --:--:-- --:--:--  0 
* Trying 194.73.98.116... 
* Connected to www.mywebsite.com (111.11.11.111) port 443 (#0) 
* ALPN, offering http/1.1 
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH 
* TLSv1.2 (OUT), TLS header, Certificate Status (22): 
} [5 bytes data] 
* TLSv1.2 (OUT), TLS handshake, Client hello (1): 
} [512 bytes data] 
* TLSv1.2 (IN), TLS handshake, Server hello (2): 
{ [85 bytes data] 
* TLSv1.2 (IN), TLS handshake, Certificate (11): 
{ [2618 bytes data] 
* TLSv1.2 (IN), TLS handshake, Server key exchange (12): 
{ [401 bytes data] 
* TLSv1.2 (IN), TLS handshake, Server finished (14): 
{ [4 bytes data] 
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16): 
} [138 bytes data] 
* TLSv1.2 (OUT), TLS change cipher, Client hello (1): 
} [1 bytes data] 
* TLSv1.2 (OUT), TLS handshake, Finished (20): 
} [16 bytes data] 
* TLSv1.2 (IN), TLS change cipher, Client hello (1): 
{ [1 bytes data] 
* TLSv1.2 (IN), TLS handshake, Finished (20): 
{ [16 bytes data] 
* SSL connection using TLSv1.2/ECDHE-RSA-AES256-SHA384 
* ALPN, server did not agree to a protocol 
* Server certificate: 
* subject: OU=Domain Control Validated; CN=*.mywebsite.com 
* start date: 2015-07-29 13:37:38 GMT 
* expire date: 2018-07-29 13:37:38 GMT 
* issuer: C=US; ST=Arizona; L=Scottsdale; O=GoDaddy.com, Inc.; OU=http://certs.godaddy.com/repository/; CN=Go Daddy Secure Certificate Authority - G2 
* SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway. 
} [5 bytes data] 
> GET /Account/Login HTTP/1.1 
> Host: www.mywebsite.com 
> User-Agent: curl/7.43.0 
> Accept: */* 
> 
{ [5 bytes data] 
< HTTP/1.1 200 OK 
< Cache-Control: no-cache, no-store, must-revalidate 
< Pragma: no-cache 
< Content-Type: text/html; charset=utf-8 
< Expires: -1 
< Server: Microsoft-IIS/8.5 
< Strict-Transport-Security: max-age=31536000; includeSubdomains; preload 
< X-Frame-Options: Deny 
< X-Content-Type-Options: nosniff 
< X-XSS-Protection: 1; mode=block 
< Content-Security-Policy: default-src 'self';script-src 'self' www.google-analytics.com www.googletagmanager.com;object-src 'none';style-src 'self' fonts.googleapis.com;img-src 'self' www.google-analytics.com placehold.it placeholdit.imgix.net data:;media-src 'none';frame-src 'none';font-src 'self' fonts.gstatic.com;connect-src 'self';base-uri 'self';child-src 'none';frame-ancestors 'none';report-uri /WebResource.axd?cspReport=true 
< X-Frame-Options: SAMEORIGIN 
< X-Frame-Options: SAMEORIGIN 
< Set-Cookie: __RequestVerificationToken=bPWxIp8e4F4I0Jt26t5oZyvDM6059tAWSRbgc-b6Df5IMjyYFDD9fJKgRsKVjbtN3EGgtFuHcf1sTjlYSwDWgnlhSUuNW1q5yv3cGMxmEwE1; path=/; HttpOnly 
< Date: Fri, 04 Dec 2015 10:03:35 GMT 
< Content-Length: 12596 
< 
{ [12596 bytes data] 
100 12596 100 12596 0  0 31101  0 --:--:-- --:--:-- --:--:-- 31101 
* Connection #0 to host www.mywebsite.com left intact 
+0

Questo tipo di bandiere vengono inviati verso il basso dal server correttamente la prima volta che ricevi il cookie. Quindi potresti aggiungere la risposta HTTP dall'output dell'arricciatura? –

+0

@MehmetInce: ho aggiunto l'output cURL come richiesto. –

+0

Questo è strano, il tuo codice web.config ha funzionato bene per me. – nmit026

risposta

6

Il suggerito senso intorno questo serve a proteggere l'ID di sessione e i cookie di richiesta di modulo durante la gestione delle richieste di pagina, ad es

// This code will mark the forms authentication cookie and the 
// session cookie as Secure. 
if (Response.Cookies.Count > 0) 
{ 
    foreach (string s in Response.Cookies.AllKeys) 
    { 
     if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid") 
     { 
      Response.Cookies[s].Secure = true; 
     } 
    } 
} 

così come una linea aggiuntiva nel WebConfig per il fissaggio gettoni forma di accesso:

<authentication mode="Forms"> 
    <forms ... requireSSL="true" /> 
</authentication> 

Fonti: Securing Request-Response cookies-Secure forms authentication via Web.config

+0

Grazie, ci proverò. Sebbene non utilizzi l'autenticazione basata su form (o almeno non configurata tramite web.config), questa risposta mi ha spinto a cercare un'opzione di configurazione simile all'interno del codice di installazione di autenticazione ** Identità ASP.NET **. Sembra che la classe 'CookieAuthenticationOptions' abbia proprietà' CookieHttpOnly' e 'CookieSecure', l'ultima delle quali sembra promettente. –

+0

@MalikKhalil: mi permetto di dissentire: https://msdn.microsoft.com/en-us/library/microsoft.owin.security.cookies.cookieauthenticationoptions(v=vs.113).aspx –

+0

Ah, capito .. .Grazie per avermi corretto @GaryMcGill –

Problemi correlati