2012-04-12 2 views
2

Ich versuche, eine Webanwendung, die eine SSL-Verbindung verwendet, zu erstellen. Also habe ich etwas recherchiert und herausgefunden, dass ich die RequireHttpsAttribute-Klasse verwenden kann, um zu erreichen, was ich brauche. Die Sache ist, dass wenn ich es benutze, die Ausführung der Anwendung zu einem 310 Fehler führt (zu viele Umleitungen). Ich habe sogar eine benutzerdefinierte Klasse für den Wechsel von http zu https erstellt. Aber das führt auch zu einem Fehler.MVC3, RequireHttps und benutzerdefinierte Handler führen zu http 310

meine Klasse te Protokollvermittler zu handhaben:

Public Class RequireSSLAttribute 
    Inherits ActionFilterAttribute 

    Public Property IsRequired() As Boolean 

    Public Overrides Sub OnActionExecuting(filterContext As ActionExecutingContext) 
     If Me.IsRequired AndAlso filterContext.HttpContext.Request.Url.Scheme <> "https" Then 
      filterContext.HttpContext.Response.Redirect(filterContext.HttpContext.Request.Url.OriginalString.Replace("http:", "https:").Remove(filterContext.HttpContext.Request.Url.OriginalString.LastIndexOf(":") + 1), True) 
      filterContext.Result = New HttpUnauthorizedResult 
     End If 
    End Sub 

    Public Sub New() 
     IsRequired = True 
    End Sub 
End Class 

Antwort

12

Ich weiß nicht, zu ändern, die Ihr Gastgeber ist, aber ich lief in ein ähnliches Problem auf AppHarbor und entdeckte dies in ihrem :

Wenn Sie das integrierte RequireHttpsAttribute verwenden, um e Vergewissern Sie sich, dass eine Controller-Aktion immer HTTPS verwendet, Sie werden eine Umleitung Schleife erleben. Der Grund dafür ist, dass SSL auf der Load-Balancer-Ebene beendet wird und RequireHttps den Header X-Forwarded-Proto nicht erkennt, den es verwendet, um anzuzeigen, dass die Anforderung mithilfe von HTTPS erfolgt ist. Sie sollten daher ein benutzerdefiniertes RequireHttps-Attribut für diesen Zweck verwenden.

Sie haben eine hoch Beispiel Lösung auf Github here, die ich weiter unten für die Bequemlichkeit kopiert:

using System; 
using System.Web.Mvc; 
using RequireHttpsAttributeBase = System.Web.Mvc.RequireHttpsAttribute; 

namespace AppHarbor.Web 
{ 
    [AttributeUsage(
     AttributeTargets.Class | AttributeTargets.Method, 
     Inherited = true, 
     AllowMultiple = false)] 
    public class RequireHttpsAttribute : RequireHttpsAttributeBase 
    { 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      if (filterContext == null) 
      { 
       throw new ArgumentNullException("filterContext"); 
      } 

      if (filterContext.HttpContext.Request.IsSecureConnection) 
      { 
       return; 
      } 

      if (string.Equals(filterContext.HttpContext.Request.Headers["X-Forwarded-Proto"], 
       "https", 
       StringComparison.InvariantCultureIgnoreCase)) 
      { 
       return; 
      } 

      if (filterContext.HttpContext.Request.IsLocal) 
      { 
       return; 
      } 

      HandleNonHttpsRequest(filterContext); 
     } 
    } 
} 

Ich bin nicht sicher, ob dies Ihr Problem lösen wird; Aber vielleicht, selbst wenn Sie AppHarbor nicht verwenden, kann die Ursache für Sie die gleiche sein, in welchem ​​Fall das oben genannte einen Versuch wert ist.

+1

Danke für die Veröffentlichung. Dies funktionierte für Amazon Elastic Beanstalk. –

+0

Beachtet die Reihenfolge dieser drei? if (filterContext.HttpContext.Request.IsSecureConnection), if (string.Equals (filterContext.HttpContext.Request.Headers ["X-Weitergeleitetes-Proto"], "https", StringComparison.InvariantCultureIgnoreCase)), if (filterContext. HttpContext.Request.IsLocal). Und warum muss ich if (filterContext.HttpContext.Request.IsSecureConnection) und if (filterContext.HttpContext.Request.IsLocal) überhaupt haben? – PussInBoots

0

Versuchen Sie es zu

If Me.IsRequired AndAlso filterContext.HttpContext.Request.Url.Scheme <> "https" Then 
    secureUrl = filterContext.HttpContext.Request.Url.OriginalString.Replace("http:", "https:").Remove(filterContext.HttpContext.Request.Url.OriginalString.LastIndexOf(":") + 1) 
    filterContext.Result = new RedirectResult(secureUrl) 
End If 
+0

Es funktioniert nicht unordentlich, aber ich denke nicht, es ist die eigentliche Umleitung. Es sollte jedoch nicht über die If ... then-Klausel hinausgehen, wenn auf https zugegriffen wird. – Feanaro

+0

Macht es immer noch die unendliche Umleitung? Haben Sie auch irgendwelche AuthorizationFilter? –

+0

Für den Login-Controller, der der erste Controller ist, habe ich keine Autorisierungsfilter. Der Controller hinter dem Login verwendet jedoch diese Filter. Aber du kannst es nicht erreichen, bevor du dich anmeldest, hoffe ich zumindest. – Feanaro

Verwandte Themen