Переключение между HTTP и HTTPS в ASP.NET MVC 1.0

#asp.net-mvc #ssl

#asp.net-mvc #ssl

Вопрос:

Я использую MVC 1.0 и создал «RequireSSLAttribute» (подобный тому, что в ASP.NET MVC 1.0 поддерживает, но игнорирует директивы SSL для локального компьютера). Я хочу включить SSL на страницах регистрации и входа в систему для защиты отправляемых паролей. Однако я хочу, чтобы остальная часть сайта не поддерживала SSL.

Добавив атрибут [requireSSL] к методам регистрации и входа в систему моего контроллера, я могу успешно перенаправить приложение на соответствующую страницу с использованием HTTPS. Однако все страницы после регистрации или входа в систему продолжают использовать SSL.

Есть ли какой-либо способ заставить приложение переключиться обратно на HTTP без необходимости создавать «RequireNonSslAttribute», который мне пришлось бы добавлять ко всем другим методам контроллера?

Спасибо.

Комментарии:

1. У меня была такая же проблема, и я решил ее, создав то же самое, что и вы. Я хотел бы знать, может ли кто-нибудь помочь и здесь.

2. Возможно, вы также захотите взглянуть на это: owasp.org/index.php /…

Ответ №1:

Что, если вы просто добавите его в действие контроллера, на которое вы перенаправляете после входа в систему? Или добавьте перенаправление в свой базовый контроллер. Например, мы делаем что-то подобное в базовом OnActionExecuting:

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

Для нас это был самый быстрый способ выполнить в основном то же самое (у нашего домашнего контроллера были действия типа входа в систему).

Комментарии:

1. Это должно сработать. Единственная проблема, с которой я столкнулся сейчас, заключается в том, что атрибут action в теге формы, который отображается BeginForm, создает относительный URL, который не является HTTPS. Похоже, мне придется переопределить атрибут action абсолютным URL-адресом HTTPS, используя перегруженную версию метода BeginForm. Должно сработать, но тьфу.

Ответ №2:

В вашем классе ControllerBase вы можете переопределить контроллер.Выполните авторизацию, а затем проверьте, установлен ли атрибут RequireHttps (атрибут RequireHttpsAttribute является новым в MVC2) в действии контроллера. Если атрибут RequireHttps не установлен И запрос выполняется по протоколу SSL, то верните результат перенаправления на URL, отличный от ssl. Таким образом, вам не нужно устанавливать атрибут controller, а затем помещать controller.action name где-либо еще.

 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 amp;amp; !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);
}
  

Ответ №3:

Переход с HTTPS на HTTP, пока пользователь все еще входит в систему, несет в себе угрозу безопасности, поскольку при последующих публикациях файл cookie аутентификации по-прежнему будет передаваться из браузера пользователю, но на этот раз он не будет зашифрован.

После входа в систему лучше (с точки зрения безопасности) продолжать использовать HTTPS. В любом случае, пока выполняется TCP-сеанс, устанавливается начальное рукопожатие, поэтому большого снижения производительности также не будет.

Ответ №4:

Я использовал этот код на контроллере.Онатурализация.

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

Ответ.ApplyAppPathModifier поддерживает сеанс без приготовления.

HttpResponse.Метод ApplyAppPathModifier (System.Web)