2010-03-10 15 views
8

Ich verwende MVC 1.0 und habe ein "RequireSSLAttribute" erstellt (wie das in ASP.NET MVC 1.0 Futures aber ignoriert SSL-Anweisungen für lokale Computer). Ich möchte die Anmelde- und Anmeldeseiten SSL aktivieren, um die gesendeten Kennwörter zu schützen. Ich möchte jedoch, dass der Rest der Website nicht SSL ist.Zwischen HTTP und HTTPS in ASP.NET wechseln MVC 1.0

Durch Hinzufügen des [RequireSSL] -Attributs zu den Anmeldungs- und Anmeldemethoden meines Controllers kann ich die App erfolgreich auf die entsprechende Seite mit HTTPS umleiten. Alle Seiten nach der Anmeldung oder Anmeldung verwenden jedoch weiterhin SSL.

Gibt es eine Möglichkeit, die App zurück zu HTTP zu wechseln, ohne ein "RequireNonSslAttribute" erstellen zu müssen, das ich allen anderen Controller-Methoden hinzufügen müsste?

Danke.

+0

Ich hatte das gleiche Problem, und ich löste es durch die gleiche Sache zu schaffen Sie getan haben. Ich würde gerne wissen, ob hier jemand auch helfen könnte. –

+0

Sie können auch sehen: https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet#Rule_-_Use_TLS_for_All_Login_Pages_and_All_Authenticated_Pages – Bruno

Antwort

1

Was ist, wenn Sie es nur zur Controller-Aktion hinzufügen, zu der Sie nach der Anmeldung weiterleiten? Oder fügen Sie eine Umleitung in Ihrem Basiscontroller hinzu. Zum Beispiel haben wir etwas tun, wie dies in der Basis OnActionExecuting:

 if (req.IsSecureConnection && 
      filterContext.RouteData.Values["controller"] 
         .ToString().ToLower() != "home") 
     { 
      string url = req.Url.ToString().ToLower().Replace("http:", "https:"); 
      res.Redirect(url); 
     } 

Dies war der schnellste Weg für uns im Grunde die gleiche Sache (unsere Heimsteuerung hatte die Login-Typen Aktionen) zu erreichen.

+0

Dies sollte funktionieren. Das einzige Problem, das ich jetzt habe, ist, dass das Aktionsattribut im Formular-Tag, das von BeginForm gerendert wird, eine relative URL erstellt, die nicht HTTPS ist. Offenbar muss ich das Aktionsattribut mit einer absoluten HTTPS-URL überschreiben, indem ich die überladene Version der BeginForm-Methode verwende. Sollte funktionieren, aber hm. – goombaloon

1

In Ihrer ControllerBase-Klasse können Sie Controller.OnAuthorization überschreiben und dann prüfen, ob das RequireHttps-Attribut (das RequireHttpsAttribute ist neu in MVC2) in der Controller-Aktion festgelegt wird. Wenn das RequireHttps-Attribut nicht festgelegt ist UND die Anforderung unter SSL steht, geben Sie ein Umleitungsergebnis an die Nicht-SSL-URL zurück. Auf diese Weise müssen Sie nicht sowohl ein Controller-Attribut als auch einen controller.action-Namen an einer anderen Stelle setzen.

protected override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    Boolean requireHttps = false; 
    requireHttps = filterContext.ActionDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), false).Count() >= 1; 

    //the RequireHttpsAttribute set on the Controller Action 
    //will handle redirecting to Https. 
    // We just need to handle any requests 
    //that are already under SSL but should not be. 

    //If this request is under ssl but yet the controller action 
    // does not require it, then redirect to the http version. 
    if (Request.IsSecureConnection && !requireHttps) 
    { 
     UriBuilder uriBuilder = new UriBuilder(Request.Url); 

     //change the scheme 
     uriBuilder.Scheme = "http"; 
     uriBuilder.Port = 80; 

     filterContext.Result = this.Redirect(uriBuilder.Uri.AbsoluteUri); 
    } 


    base.OnAuthorization(filterContext); 
} 
1

Umzug von HTTPS zu HTTP, während der Benutzer noch angemeldet ist, auf ein Sicherheitsrisiko trägt, weil auf den nachfolgenden Stellen der Authentifizierungs-Cookie für den Benutzer über den Browser noch übertragen werden, aber dieses Mal wird es nicht verschlüsselt werden.

Einmal angemeldet, ist es am besten (aus Sicherheitsgründen), HTTPS weiter zu verwenden. In jedem Fall, solange die TCP-Sitzung eingeschaltet ist, wird das anfängliche Hand-Wackeln eingestellt, so dass es auch keinen großen Erfolg bei der Leistung geben wird.

0

Ich habe diesen Code auf Controller.OnAturophotization verwendet.

var redirect = string.Format(
"https://{0}{1}", 
filterContext.HttpContext.Request.Url.Authority, 
Response.ApplyAppPathModifier(filterContext.HttpContext.Request.Url.AbsolutePath)); 
var queryString = filterContext.HttpContext.Request.QueryString.ToString(); 
if (!string.IsNullOrEmpty(queryString)) 
redirect += "?" + queryString; 

filterContext.Result = new RedirectResult(redirect); 

Response.ApplyAppPathModifier ist die Unterstützung cookieless Sitzung.

HttpResponse.ApplyAppPathModifier Method (System.Web)