Подтвердить что ты не робот

ASP.NET MVC - HTML.BeginForm и SSL

Я столкнулся с проблемой с тем, что должно быть простой формой входа в ASP.NET MVC 2. По существу моя форма выглядит примерно так:

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

У меня есть фильтр RequiresHTTPS в методе действия LogOn, но когда он выполняется, я получаю следующее сообщение

Запрошенный ресурс может быть доступ через SSL

В этот момент единственным решением, которое работало, было передать дополнительный атрибут html action следующим образом:

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

В то время как это работает, я задаюсь вопросом: а) почему я вижу эту проблему в первую очередь и б) если есть более простой способ публикации на https с http-страницы?

[изменить]

Я должен был указать, что выпадающий список входа будет доступен на многих общедоступных страницах. Я не хочу, чтобы все мои страницы были HTTPS. Например, моя страница надежды, которую ANYONE может видеть, не должна основываться на HTTPS. По сути, мне нужно указать протокол в моей форме, но не знаю, как это сделать или если это возможно.

Буду признателен за любые советы/предложения. Спасибо заранее

В JP

4b9b3361

Ответ 1

Вы можете использовать

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

Ответ 2

Используйте атрибут [RequireHttps] как для действия, которое отображает форму, так и для той, которую вы отправляете.

Ответ 3

Обновление. Просмотрите комментарии ниже об уязвимостях безопасности этого подхода, прежде чем рассматривать использование этого кода.

Я обнаружил, что работает гибрид примеров кода JP и Malcolm.

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

Все еще чувствовал себя немного взломанным, хотя я создал специальный помощник BeginForm. Пользовательский помощник чист и не требует https при работе локально.

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;
    }

Пример использования:

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