2010-11-17 10 views
14

Possiedo un sito Web ASP.NET (MVC) che pubblica contenuto statico (immagini) e contenuto dinamico dello stesso dominio. Il sito utilizza auth di moduli e ha un controller di accesso. Ci sono stati alcuni problemi molto strani/irregolari con persone che si ritrovano loggate o disconnesse a intervalli casuali, e abbiamo rintracciato un problema con un proxy inverso che memorizza nella cache un file immagine che ha un'intestazione di risposta set-cookie che imposta il auth cookie. Una volta memorizzato nella cache, tutti ricevono lo stesso cookie di autenticazione, il che porta a risultati molto bizzarri.Perché ASP.NET forma i cookie di impostazione dell'autenticazione su una richiesta di immagine statica?

La mia domanda è: come mai un'immagine otterrà un'intestazione dell'insieme di cookie in primo luogo? Che cosa fa il modulo di autenticazione dei moduli ASP.NET per causare questo - sicuramente imposta il cookie sulla risposta del contenuto HTML principale. Ottengo che il cookie auth viene quindi inviato con tutte le richieste successive al dominio, ma non riesco a capire come viene impostato il cookie in primo luogo.

(A proposito di questo problema potrebbe esserci anche il colpevole di almeno due grandi siti di e-commerce esistenti che soffrono di problemi simili, senza soluzione, quindi sarebbe una buona soluzione).

La risposta è indicata di seguito (tratta dal violinista).

HTTP/1.1 200 OK 
Cache-Control: public, max-age=86400,max-age=86400 
Content-Type: image/png 
Last-Modified: Thu, 04 Nov 2010 16:00:52 GMT 
Accept-Ranges: bytes 
ETag: "0528474397ccb1:0" 
Server: Microsoft-IIS/7.5 
Set-Cookie: my-auth-cookie=6BC25F1EF71989466A48C0120E7739E; path=/; HttpOnly 
Date: Wed, 17 Nov 2010 17:15:08 GMT 
Content-Length: 15790 

Update: informazioni aggiuntive - stiamo usando IIS 7.5 su Win2008 R2, a 64 bit, e l'applicazione è in esecuzione con una piscina app che sta usando la pipeline integrata/.net 4.

Update 2: Non sto cercando una soluzione al problema, ne abbiamo già uno. Sto cercando una risposta alla domanda, che è il motivo per cui è successo in primo luogo? Si prega di non rispondere dicendomi dei sottodomini o di come funzionano i cookie!

Update 3: l'aggiunta nella richiesta:

GET https://www.example.com/sprite.png HTTP/1.1 
Host: www.example.com 
Connection: keep-alive 
Cache-Control: no-cache 
Pragma: no-cache 
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Cookie: my-auth-cookie=6BC25F1EF71989466A48C0120E7739E; 
+0

+1, domanda molto interessante. @ Hugo, sei riuscito a riprodurre questo comportamento o è casuale? –

+0

@Hugo, stai rafforzando SSL sul tuo sito perché noto che questo cookie è impostato senza il flag 'secure'? –

+0

Darin, sì stiamo applicando SSL: l'intero sito è in esecuzione in SSL, sebbene il punto di terminazione sia il proxy inverso (IIS con ARR installato) non i server Web stessi. La soluzione al problema è di servire le immagini di un diverso sottodominio/sito, ma come giustamente fai notare di seguito che non risponde alla domanda, che è come/perché è successo in primo luogo. –

risposta

0

Rispondere a questa me stesso per chiudere la questione e prevenire ulteriori aggiornamenti.

La causa principale del comportamento che stavo vedendo era dovuta ai cookie di impostazione della pipeline integrata su file statici (css, images, js) - vedere il thread dei commenti per ulteriori dettagli.

È stato risolto quando abbiamo spostato il contenuto statico su un host diverso nell'ambiente di produzione/staging.

0

Poiché è possibile utilizzare autenticazione basata su form per assicurare contenuti statici.

+1

E come questo risponde alla domanda? Vedi il commento che ho lasciato sulla risposta @Zain Shaikh. –

-2

per impostazione predefinita, il browser invia i cookie con ogni richiesta effettuata sullo same domain.

la soluzione semplice è spostare le immagini su un altro dominio, ad esempio youtube per un dominio http://s.ytimg.com/yt/img/watch/ per salvare tutte le immagini.

+2

Non hai letto la domanda? Non vedi l'intestazione di risposta 'Set-Cookie'? Questo è l'impostazione di un cookie e non il client che lo passa attraverso l'intestazione 'Cookie' nella richiesta. –

+0

Grazie Darin :-) –

1

Sospetto che non si tratti in realtà di un problema .NET e che la chiave dei problemi è in realtà il proxy inverso.

Quando si pubblica contenuto statico da un percorso di autenticazione di moduli, i cookie associati alla connessione verranno inviati insieme ad esso. Quindi, se hai eseguito l'accesso come utente X, sessione 1 e ottieni immagine foo.png, il tuo proxy inverso vede il file PNG imbattersi in intestazioni che indicano che può essere memorizzato nella cache.

La prossima volta che viene richiesto il file, il proxy inverso sta servendo il file direttamente, insieme al cookie che aveva associato a quel file quando lo ha ricevuto l'ultima volta.

Come esperimento, suggerisco di impostare il proxy inverso per disattivare la funzionalità di memorizzazione nella cache e verificare se il problema persiste.

Se è necessario il proxy inverso per eseguire la memorizzazione nella cache del contenuto, quindi suggerirei di verificare se il proxy può ignorare i cookie per i file memorizzati nella cache o spostare i file in un altro senza cookie/auth-less dominio.

+0

Will, hai ragione, questo è il problema, che abbiamo già risolto in produzione. Questa è stata più una domanda alla comunità sul perché è successo in primo luogo (impostazione dei cookie sul contenuto statico). Legare IIS e ASP.NET insieme potrebbe sembrare una buona idea al momento, ma sta provando un vero dolore negli scenari di produzione (ho un'altra domanda aperta su serverfault sulle opzioni di autenticazione). –

+0

Ciao Hugo, di nuovo - non penso che sia .NET/IIS direttamente questo è il problema. Come ho detto, rimuovi il proxy inverso dall'equazione e, se ho ragione, il problema scompare. Se sbaglio, allora è qualcosa di più profondo. –

2

Sembra un errore in IIS per me. Scriverò un codice paglia per vedere se capisco perfettamente cosa sta succedendo e pubblichi i risultati. Verificherò anche su IIS 7 e IIS 7.5 per vedere se è diverso.

Non sembra proprio che una richiesta debba ricevere QUALSIASI cookie associato a una precedente richiesta (NON abbiamo alcun proxy di memorizzazione nella cache sul nostro sito e questo sta accadendo a noi sulla nostra rete interna, quindi la mia conclusione è che IIS lo sta facendo da qualche parte).

--Owen

+0

Bene, non posso riprodurre in un semplice esempio di uomo di paglia (pagina web con un mucchio di immagini, un altro per impostare cookie). Assolutamente no, come mai nessuna delle immagini ha il set di cookie di una seconda macchina ... FWIW –