Я использую ASP.NET MVC 2 и имею страницу входа в систему, которая защищается через HTTPS. Чтобы гарантировать, что пользователь всегда получает доступ к тем страницам через SSL, я добавил атрибут [RequireHttps]
к контроллеру. Это делает задание отлично.
Когда они успешно вошли в систему, я хотел бы перенаправить их назад к версии HTTP. Однако нет a [RequireHttp]
атрибут и я изо всех сил пытаемся получить мою голову вокруг, как я мог бы достигнуть этого.
Добавленная (потенциальная) сложность - то, что веб-сайт, когда в производстве размещается в маршруте домена, но в целях разработки и тестирования это в подкаталоге / виртуальный каталог / приложение.
Я сверхдумаю это и являюсь там легким решением, бросающимся мне в глаза? Или действительно ли это немного более сложно?
После небольшого покопания я пошел вдоль линий проката своих собственных, как и не было ' t кажется хорошим встроенным решением для этого (как уже упоминалось, есть отличное решение для приложений MVC2 в виде [RequireHttps] ). Вдохновленный çağdaş решением этой проблемы , я адаптировался, чтобы придумать следующий код:
public class RequireHttp : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// If the request has arrived via HTTPS...
if (filterContext.HttpContext.Request.IsSecureConnection)
{
filterContext.Result = new RedirectResult(filterContext.HttpContext.Request.Url.ToString().Replace("https:", "http:")); // Go on, bugger off "s"!
filterContext.Result.ExecuteResult(filterContext);
}
base.OnActionExecuting(filterContext);
}
}
Теперь я могу добавить его к своим методам контроллера, и он работает (по-видимому) как и ожидалось. Если я перенаправляю на действие Index на моем контроллере с протокола HTTPS, он будет перенаправлен на HTTP. Он разрешает только HTTP-доступ к Index ActionResult.
[RequireHttp]
public ActionResult Index() {
return View();
}