2009-12-16 5 views
8

Je travaille sur un projet qui a une page qui doit utiliser le certificat SSL. Tous les liens dans le site de cette page utilisent https au lieu de http, mais dans le cas où un utilisateur peut accéder directement à la page, je veux que la version http de la page se redirige vers elle-même mais utilise https.ASP.NET: meilleure pratique pour rediriger vers https

Je peux faire un Response.Redirect dans l'événement page_load. Je peux écrire javascript qui mettra à jour la location.href qui provoquera la publication. Je suis sûr qu'il y a plus de façons de peler ce chat.

Ma question est, quelle est la meilleure pratique pour un site ASP.NET sur IIS 6 ou 7 pour rediriger une page http vers https? Existe-t-il une meilleure pratique ou toutes les alternatives sont-elles égales?

+0

FWIW - chemin après avoir publié cela, et après avoir utilisé quelques autres méthodes, j'ai trouvé la discussion précédente suivante très utile: http://stackoverflow.com/questions/47089/best-way-in-asp-net-to-force-https-for-an-entire-site –

Répondre

12

j'utiliser la réécriture pour faire cette URL. Pourquoi? car il est simple à implémenter, ne nécessite aucune modification de l'application et est facile à maintenir.

Sur IIS7 vous pouvez accomplir qu'utiliser URL rewrite module, par exemple:

<!-- http:// to https:// rule --> 
<rule name="ForceHttpsBilling" stopProcessing="true"> 
    <match url="(.*)billing/(.*)" ignoreCase="true" /> 
    <conditions> 
    <add input="{HTTPS}" pattern="off" ignoreCase="false" /> 
    </conditions> 
    <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}{REQUEST_URI}" /> 
</rule> 

Sur IIS6 vous devrez utiliser une bibliothèque 3ème partie. J'utilise IIRF (http://www.codeplex.com/IIRF) c'est gratuit, stable, et a une bonne quantité de fonctionnalités.

+0

Merci d'avoir ajouté un exemple Pavel. Je suis toujours sur IIS6 alors ne vous êtes pas salis avec le module de réécriture d'IIS7. Cela semble prometteur cependant :) – Ariel

1

J'appellerais Response.Redirect dans page_load. Il est plus simple que de générer le javascript et enverra moins d'octets au client.

Code example

+0

Ray - C'est un bon point à propos de moins d'octets envoyés en utilisant le CodeFile logique au lieu de javascript qui est envoyé dans chaque demande.Merci –

+0

Lors de la redirection via js, vous devez également penser aux clients sans js ou avec js disabled, ce qui rendrait l'application moins sécurisée. La validation côté serveur est plus légère et plus sécurisée. – Ariel

2

En fait, la meilleure pratique serait de le faire dans l'un des trois endroits, en supposant que les paramètres matériels ou IIS ne sont pas une option. Juste des options de code.

  1. Dans un HTTPModule. HttpModules sont exécutés avant que toute demande est traitée, de sorte que vous pouvez faire l'URL vérifier et rediriger là. C'est ce que je ferais.
  2. Dans Global.asax.
  3. Dans une page de base personnalisée, dans la fonction init.

Toutes ces options seraient bonnes. Un et deux sont garantis d'être touchés par chaque demande traitée par ASP.NET. Le troisième exige que vous vous assuriez que toutes vos pages héritent de la page de base.

Je ne mettrais pas le code dans chaque page, c'est juste une mauvaise programmation. Faites-moi savoir si vous avez besoin de plus de précisions, mais c'est un bon début.

+1

+ 1 réponse très valide ne sais pas pourquoi quelqu'un DV'd –

1

Généralement, il existe des parties spécifiques du site que vous souhaitez toujours être HTTPS ou HTTP.

J'utilise l'attribut d'action suivante pour convertir le trafic soit à l'un ou l'autre:

public class ForceConnectionSchemeAttribute : ActionFilterAttribute 
{ 
    private string scheme; 

    public ForceConnectionSchemeAttribute(string scheme) 
    { 
     this.scheme = scheme.ToLower(); 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Uri url = filterContext.HttpContext.Request.Url; 
     if (url.Scheme != scheme) 
     { 
      string secureUrl = String.Format("{0}://{1}{2}", scheme, url.Host, url.PathAndQuery); 
      filterContext.Result = new RedirectResult(secureUrl); 
     } 
    } 
} 


// Suppose I always want users to use HTTPS to access their personal info: 
[ForceConnectionScheme("https")] 
public class UserController: Controller 
{ 
    // blah 
} 
+0

Cette approche suppose que vous utilisez MVC. –

Questions connexes