2010-02-24 3 views
3

J'utilise un ActionFilter (voir ci-dessous) pour détecter si 1. le contrôleur/l'action en cours requiert SSL et 2. SSL est actuellement utilisé, et redirige en conséquence.Rediriger la boucle avec le filtre d'action SSL dans ASP.NET MVC

Cela fonctionne très bien localement (en utilisant un cert factice dans IIS 7) mais une fois que je l'ai récupéré sur le serveur, j'obtiens une erreur indiquant une boucle de redirection infinie.

Des idées?

public class SslFilter : ActionFilterAttribute 
{ 
    public SslFilter(bool sslRequired) 
    { 
     SslRequired = sslRequired; 
    } 

    public bool SslRequired { get; set; } 


    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpRequestBase req = filterContext.HttpContext.Request; 
     HttpResponseBase res = filterContext.HttpContext.Response; 

     var builder = new UriBuilder(req.Url); 

     if (SslRequired && !req.IsSecureConnection) 
     { 
      builder.Scheme = Uri.UriSchemeHttps; 
      builder.Port = 443; 
      res.Redirect(builder.Uri.ToString()); 

     } 
     else if (!SslRequired && req.IsSecureConnection) 
     { 
      builder.Scheme = Uri.UriSchemeHttp; 
      builder.Port = 80; 
      res.Redirect(builder.Uri.ToString()); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

erreur Firefox:

The page isn't redirecting properly

Firefox has detected that the server is redirecting the request for this address in a way that will never complete.

This problem can sometimes be caused by disabling or refusing to accept cookies.

Répondre

2

Essayez redirigeant de manière plus MVCish:

var builder = new UriBuilder(req.Url); 

if (SslRequired && !req.IsSecureConnection) 
{ 
    builder.Scheme = Uri.UriSchemeHttps; 
    builder.Port = 443; 
    filterContext.Result = new RedirectResult(builder.Uri.ToString()); 
    filterContext.Cancel = true; 
} 
else if (!SslRequired && req.IsSecureConnection) 
{ 
    builder.Scheme = Uri.UriSchemeHttp; 
    builder.Port = 80; 
    filterContext.Result = new RedirectResult(builder.Uri.ToString()); 
    filterContext.Cancel = true; 
} 
else 
{ 
    base.OnActionExecuting(filterContext); 
} 
+0

Nous avons essayé cette approche et l'approche originale d'Alex H. Dans les deux cas, ils ont travaillé dans nos environnements de développement, mais pas dans la production. Cependant, l'approche acceptée dans cette question a fonctionné - http://stackoverflow.com/questions/2302081/how-do-i-set-the-protocoll-when-using-redirecttoaction –

1

J'ai eu ce même problème sur un site que je construis et a constaté que pour certains raison pour laquelle il avait à faire avec le numéro de port dans l'URL. Ainsi, builder.Uri.ToString() a été sortie http://domain.com:80/ ou https://domain.com:443/, qui, autant que je sache, devrait être bien, mais nous avons changé pour utiliser builder.Uri.AbsoluteUri et il a résolu le problème. Voici un exemple de notre code ...

UriBuilder __urlBuilder = new UriBuilder(__context.Request.Url); 
if (!HttpContext.Current.Request.Url.Scheme.Contains("https")) { 
    if (this.Required == RequiredStates.Required) { 
    __urlBuilder.Scheme = "https"; 
    __urlBuilder.Port = 443; 
    HttpContext.Current.Response.Redirect(__urlBuilder.Uri.AbsoluteUri, true); 
    } 
} 
else { 
    if (this.Required == RequiredStates.NotRequired) { 
    __urlBuilder.Scheme = "http"; 
    __urlBuilder.Port = 80; 
    HttpContext.Current.Response.Redirect(__urlBuilder.Uri.AbsoluteUri, true); 
    } 
} 
0

Veuillez vérifier le certificat installé sur le serveur. Utilisez l'outil de configuration SSL de MS pour détecter le problème. Le plus probablement le privé est manquant.

Questions connexes