2010-05-26 4 views
0

Je vois une boucle de redirection de nos serveurs de production lorsque nous activons l'attribut suivant sur une classe de contrôleur:Filtre ASP.NET MVC action Redirect boucle

public class TestRedirectHttpsAttribute : RedirectHttpsAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (Convert.ToBoolean(ConfigurationManager.AppSettings["TestSecureEnabled"] ?? bool.FalseString)) 
     { 
      base.OnAuthorization(filterContext); 
     } 
    } 
} 


public class RedirectHttpsAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public virtual void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     if (!filterContext.HttpContext.Request.IsSecureConnection) 
     { 
      UriBuilder uriBuilder = new UriBuilder(filterContext.HttpContext.Request.Url); 
      uriBuilder.Scheme = "https"; 
      uriBuilder.Port = -1; // Don't inject port 
      filterContext.Result = new RedirectResult(uriBuilder.ToString()); 
     } 
    } 
} 

Je sais ce qui est similaire à la question - Redirect loop with SSL action filter in ASP.NET MVC mais On l'a demandé en février et j'espérais que quelqu'un pourrait avoir une meilleure solution. La solution pour la question dans le lien était de rediriger à partir d'une action dans le contrôleur mais si nous voulons rediriger toutes les actions vers HTTPS, nous devrions nous assurer qu'il a été appelé dans chaque plutôt que d'appliquer un FilterAttribute personnalisé au contrôleur.

Remarque: Ce code fonctionne à partir de nos environnements de développement utilisant des certificats SSL factices.

J'ai peut-être mal compris et je devrais faire autre chose, si c'est le cas, veuillez accepter mes excuses.

Répondre

1

Pour tous ceux qui pourraient avoir le même problème. C'était le résultat de notre équilibreur de charge gérant les demandes SSL et de passer à nos serveurs Web en utilisant le port 80; cela a eu pour résultat de ne pas être en mesure d'identifier qu'une demande sécurisée était bien sécurisée.

Questions connexes