2009-07-14 16 views
14

Ecco lo scenario, un utente apre una pagina non protetta dalla nostra WebApp, chiamiamola PaginaA, nel proprio browser e quindi fa clic su un collegamento che li porta a un'istanza sicura di PageB. Una volta in PageB l'utente può successivamente fare clic su un collegamento che li riporta a un'istanza sicura di PageA (che hanno già visualizzato ed è in OutputCache). Ho osservato che anche se si accede a PaginaA su un URL diverso dopo aver visitato PageB (quello sicuro), in realtà sta tirando la copia cache precedente piuttosto che ne fa una nuova. Ho verificato questo comportamento in una sessione di debug e sono rimasto sorpreso dal fatto che ASP.Net abbia utilizzato lo stesso oggetto OutputCache per una copia protetta della pagina.Come configurare ASP.Net OutputCache in modo che vari da http a https?

La mia domanda è perché è così? E come posso dire a ASP.Net OutPutCache di considerare l'accesso dall'URL sicuro come un elemento diverso/univoco rispetto all'equivalente non sicuro?

[sfondo]

Recentemente abbiamo cambiato i nostri siti web le immagini sopra per usare Scene7/Akamai per tutte le immagini. Come risultato di ciò abbiamo aggiunto del codice per utilizzare diversi URL di Scene7 durante la visualizzazione di una determinata pagina su una connessione sicura. Questo problema di OutputCache non consente la logica che emette gli URL sicuri da eseguire, e si traduce in brutti avvisi del browser.

risposta

8

Penso che si può fare un VaryByCustom = "schema" e aggiungere questo al file Global.asax.cs (comprensiva di un altro paio di altri che uso e applicazione utente versione &):

public override string GetVaryByCustomString(HttpContext context, string custom) 
    { 
     if (custom.Equals("version", StringComparison.CurrentCultureIgnoreCase)) 
     { 
      Assembly asm = Assembly.GetExecutingAssembly(); 
      string[] parts = asm.FullName.Split(','); 
      string version = parts[1].Trim().ToLower(); 
      return version; 
     } 
     else if (custom.Equals("user", StringComparison.CurrentCultureIgnoreCase)) 
     { 
      var user = Membership.Users.CurrentUser; 
      return null == user ? string.Empty : user.Id.ToString(); 
     } 
     else if (custom.Equals("scheme", StringComparison.CurrentCultureIgnoreCase)) 
     { 
      var scheme = context.Request.IsSecureConnection ? "https" : "http"; 
      return scheme; 
     } 
     else 
      return base.GetVaryByCustomString(context, custom); 
    } 
+0

+1. Esattamente quello di cui avevo bisogno. Nel mio caso l'utente non dovrebbe andare su HTTPS per la mia pagina specifica. Ma nel caso in cui lo fanno, ho il codice di reindirizzamento in atto per inviarli a HTTP. Tuttavia, questo codice di reindirizzamento non funzionerebbe fino a quando non sono variato da "schema" come nel tuo esempio. –

1

Non l'ho mai provato, ma potresti essere in grado di utilizzare la proprietà Outputcache VaryByHeader e l'intestazione "host", che specifica l'host Internet e il numero di porta della risorsa richiesta.

La domanda che vorrei è perché stai reindirizzando a PageA in modo sicuro dopo PageB. Se si tratta di una pagina non protetta, non è possibile correggere il reindirizzamento PageB per reindirizzare sempre a non protetto.

+0

+1 Grazie per la risposta. Il mio esempio è molto più semplice della mia realtà. In effetti, ho molte pagine e molte pagine. Per cambiare tutti i link di nuovo alla pagina A come non sicuro da paginaB sarebbe troppo lavoro, spero che ci sia un modo più semplice. – James

13

Questo non risponde alla domanda come formulato ma potrebbe eliminare la necessità di variare in base allo schema. Se si sta codificando con difficoltà "http: //" per gli URL di Scene7, è possibile cambiarli in URL relativi allo schema.

<img src="http://site.scene7.com/images/someimage.jpg" /> 
=> 
<img src="//site.scene7.com/images/someimage.jpg" /> 

Ciò farà sì che il browser richieda automaticamente la risorsa con lo stesso schema della pagina di riferimento. Questo presuppone che tu abbia un certificato SSL per il tuo dominio scena7, naturalmente.

+1

+1 - interessante non mi rendevo conto che era possibile. – James

+1

+1 - farebbe di più se potessi ... questo dovrebbe essere contrassegnato come risposta. – caryden

+1

Tuttavia, evitare i parenti del protocollo per CSS in IE: http://www.stevesouders.com/blog/2010/02/10/5a-missing-schema-double-download/ –

Problemi correlati