2009-07-14 6 views
14

Voici le scénario, un utilisateur ouvre une page non sécurisée à partir de notre WebApp, appelons-la PageA, dans son navigateur, puis clique sur un lien qui l'amène à une instance sécurisée de PageB. Une fois dans PageB, l'utilisateur peut ensuite cliquer sur un lien qui le ramène à une instance sécurisée de PageA (qu'ils ont déjà visualisée et dans OutputCache). J'ai observé que même si PageA est accessible sur une URL différente après avoir visité PageB (la version sécurisée), elle extrait en fait la précédente copie en cache plutôt que d'en créer une nouvelle. J'ai vérifié ce comportement dans une session de débogage et j'ai été surpris qu'ASP.Net utilise le même élément OutputCache pour une copie sécurisée de la page.Comment configurer ASP.Net OutputCache pour qu'il varie en fonction de http vs https?

Ma question est la suivante: pourquoi est-ce ainsi? Et comment puis-je dire à ASP.Net OutPutCache de traiter l'accès de l'URL sécurisée comme un élément différent/unique de l'équivalent non sécurisé?

[Contexte]

Nous avons récemment changé nos images Sites Web sur l'utilisation Scene7/Akamai pour toutes les images. À la suite de cela, nous avons ajouté du code pour utiliser différentes URL Scene7 lors de la visualisation d'une page donnée sur une connexion sécurisée. Ce problème OutputCache n'autorise pas la logique qui génère les URL sécurisées à exécuter et entraîne des avertissements de navigateur moche.

Répondre

8

Je pense que vous pouvez faire un VaryByCustom = « système » et l'ajouter à votre fichier Global.asax.cs (inlcuding un autre couple d'autres que j'utilise aussi bien la version application & utilisateur):

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. Exactement ce dont j'avais besoin. Dans mon cas, l'utilisateur ne devrait pas aller à HTTPS pour ma page particulière. Mais dans le cas où ils le font, j'ai un code de redirection en place pour les envoyer à HTTP. Cependant, ce code de redirection ne fonctionnerait pas tant que je n'aurais pas changé de "schéma" comme dans votre exemple. –

1

Je ne l'ai jamais essayé, mais vous pourriez utiliser la propriété Outputcache VaryByHeader et l'en-tête «host», qui spécifie l'hôte Internet et le numéro de port de la ressource demandée.

La question que je voudrais savoir est pourquoi redirige-t-on vers PageA sur secure après de PageB. Si c'est une page non sécurisée, vous ne pouvez pas corriger la redirection PageB pour toujours rediriger vers non sécurisé.

+0

+1 Merci pour la réponse. Mon exemple est beaucoup plus simple que ma réalité. En fait, j'ai beaucoup de pageB et beaucoup de pageA. Changer tous les liens en pageA comme n'étant pas sécurisé contre pageB serait trop de travail, j'espère qu'il y a un moyen plus simple. – James

13

Ceci ne répond pas à la question telle que formulée, mais cela peut vous éviter de devoir modifier votre schéma. Si vous êtes en train de coder en dur le "http: //" pour les urls Scene7, vous pouvez les changer en urls relatives au schéma. Cela entraînera le navigateur à demander automatiquement la ressource avec le même schéma que la page de référence. C'est en supposant que vous avez un certificat SSL pour votre domaine scene7 bien sûr.

+1

+1 - intéressant Je n'ai pas réalisé que c'était possible. – James

+1

+1 - ferait plus si je pouvais ... cela devrait être marqué comme la réponse. – caryden

+1

Cependant, évitez les parentés de protocole pour CSS dans IE: http://www.stevesouders.com/blog/2010/02/10/5missing-schema-double-download/ –