#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 поддерживает сеанс без приготовления.