12 Stimmen

ASP.NET MVC - HTML.BeginForm und SSL

Ich stoße auf ein Problem mit, was sollte ein einfaches Anmeldeformular in ASP.NET MVC 2 sein. Im Wesentlichen sieht mein Formular ein wenig etwas wie dieses:

using (Html.BeginForm("LogOn", "Account", new { area = "Buyers" }, FormMethod.Post, new { ID = "buyersLogOnForm" }))

Ich habe einen RequiresHTTPS-Filter auf die LogOn Action-Methode, aber wenn es ausgeführt wird, erhalte ich die folgende Meldung

Die angeforderte Ressource kann nur über SSL zugegriffen werden

An diesem Punkt war die einzige Lösung, die funktionierte, ein zusätzliches html-Attribut für Aktionen wie folgt einzufügen:

 var actionURL = "https://"  + Request.Url.Host + Request.Url.PathAndQuery;   
 using (Html.BeginForm("LogOn", "Account", new { area = "Buyers" }, FormMethod.Post, new { ID = "buyersLogOnForm", @action = actionURL }))

Während dies funktioniert, frage ich mich, a) warum ich dieses Problem in erster Linie sehen und b) wenn es eine direktere Möglichkeit der Buchung auf https von einer http-Seite ist?

[Bearbeiten]

Ich hätte darauf hinweisen sollen, dass das Dropdown-Menü für die Anmeldung auf vielen öffentlichen Seiten verfügbar sein wird. Ich möchte nicht, dass alle meine Seiten HTTPS sind. Zum Beispiel sollte meine Hoffnungsseite - die JEDER sehen kann - nicht HTTPS-basiert sein. Im Grunde muss ich das Protokoll in meinem Formular angeben, aber ich habe keine Ahnung, wie ich das machen soll oder ob es möglich ist.

Ich würde mich über jeden Ratschlag/Vorschlag freuen. Vielen Dank im Voraus

JP

11voto

Mathias F Punkte 15112

Sie könnten verwenden

<form action =" <%= Url.Action(
"action",
"controller",
ViewContext.RouteData.Values,
"https"
) %>" method="post" >

3 Stimmen

Das Problem mit diesem ist, dass es keine FormContext für Ihr Formular erstellt, so dass alle die Html-Eingabe-Helfer nicht Validierungsattribute hinzufügen, die Ihre Ansicht Modelle angehängt...

0 Stimmen

Siehe die untenstehende Antwort von Brad J. Dies ist NICHT sicher!

6voto

Darin Dimitrov Punkte 990883

Verwenden Sie die [RequireHttps] Attribut sowohl für die Aktion, die das Formular rendert, als auch für die Aktion, an die Sie den Beitrag senden.

1 Stimmen

Das Anmelde-Dropdown wird auf vielen öffentlichen Seiten verfügbar sein. Ich möchte nicht, dass alle meine Seiten HTTPS sind. Zum Beispiel sollte meine Hoffnungsseite - die JEDER sehen kann - nicht HTTPS-basiert sein

3 Stimmen

Nutzer könnten davon abgehalten werden, ihren Benutzernamen und ihr Passwort auf einer Anmeldeseite einzugeben, auf der das Vorhängeschloss in ihrem Browser nicht sichtbar ist. Es gilt als gute Praxis, HTTPS auf Anmeldeseiten zu verwenden.

0 Stimmen

Ich verstehe, was Sie meinen. Ich bin jedoch der Meinung, dass dies eine Design-Entscheidung ist und nicht unbedingt etwas, das eine technische Einschränkung sein sollte. Nehmen Sie Twitter als Beispiel, wo ein solches Dropdown (von einer nicht https-Seite) das Anmeldeerlebnis des Benutzers verbessert - es muss nicht eine ganze Seite für zwei einfache Felder geladen werden.

5voto

Brad J Punkte 411

Aktualisierung: Lesen Sie die unten stehenden Kommentare zu den Sicherheitslücken dieses Ansatzes, bevor Sie die Verwendung dieses Codes in Betracht ziehen.

Ich fand, dass eine Mischung aus JPs und Malcolms Codebeispielen funktioniert.

using (Html.BeginForm("Login", "Account", FormMethod.Post, new { @action = Url.Action("Login","Account",ViewContext.RouteData.Values,"https") }))

Es fühlte sich aber immer noch ein bisschen hakelig an, also habe ich eine benutzerdefinierte BeginForm-Hilfe erstellt. Die benutzerdefinierte Hilfe ist sauberer und erfordert keine https, wenn lokal ausgeführt.

public static MvcForm BeginFormHttps(this HtmlHelper htmlHelper, string actionName, string controllerName)
    {
        TagBuilder form = new TagBuilder("form");
        UrlHelper Url = new UrlHelper(htmlHelper.ViewContext.RequestContext);

        //convert to https when deployed
        string protocol = htmlHelper.ViewContext.HttpContext.Request.IsLocal == true? "http" : "https";

        string formAction = Url.Action(actionName,controllerName,htmlHelper.ViewContext.RouteData.Values,protocol);
        form.MergeAttribute("action", formAction);

        FormMethod method = FormMethod.Post;
        form.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);

        htmlHelper.ViewContext.Writer.Write(form.ToString(TagRenderMode.StartTag));

        MvcForm mvcForm = new MvcForm(htmlHelper.ViewContext);

        return mvcForm;
    }

Beispiel für die Verwendung:

@using (Html.BeginFormHttps("Login", "Account"))

0 Stimmen

Es ist wirklich nicht sicher, dies zu tun. In der heutigen Zeit gibt es keinen Grund, warum nicht alle Seiten https sein können.

0 Stimmen

Können Sie erläutern, warum dies nicht sicher ist?

0 Stimmen

Denn sie ist anfällig für einen Man-in-the-Middle-Angriff. Die unverschlüsselte Seite kann während der Übertragung kompromittiert und die URL so geändert werden, dass sie auf eine andere Website verweist. Da der Benutzer die URL, auf die Sie verweisen, nicht sehen kann, gibt es für den Benutzer keine Möglichkeit, dies zu erkennen. Hier ist ein Beispiel resources.infosecinstitute.com/mitm-using-sslstrip

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X