Я использую MVC 1.0 и создал "RequireSSLAttribute" (как тот во фьючерсах ASP.NET MVC 1.0, но игнорирует директивы SSL для локального компьютера). Я хочу к SSL - позволяют знаку и страницам входа в систему защитить пароли, которые отправляются. Однако я хочу, чтобы остальной частью сайта был не-SSL.
Путем добавления [RequireSSL] приписывают знаку моего контроллера и методам входа в систему, я могу успешно заставить приложение перенаправлять к соответствующей странице с HTTPS. Однако все страницы после знака или входа в систему продолжают использовать SSL.
Там какой-либо путь состоит в том, чтобы заставить приложение переключаться назад на HTTP, не имея необходимость создавать "RequireNonSslAttribute", который я должен был бы добавить ко всем другим методам контроллера?
Спасибо.
Что, если вы просто добавите его в действие контроллера, на которое вы перенаправляете после входа в систему? Или добавьте перенаправление в свой базовый контроллер. Например, мы делаем что-то вроде этого в базовом OnActionExecuting:
if (req.IsSecureConnection &&
filterContext.RouteData.Values["controller"]
.ToString().ToLower() != "home")
{
string url = req.Url.ToString().ToLower().Replace("http:", "https:");
res.Redirect(url);
}
Это был самый быстрый способ для нас выполнить в основном то же самое (наш домашний контроллер имел действия типа входа в систему).
В своем классе ControllerBase вы можете переопределить Controller.OnAuthorization, а затем проверить, установлен ли атрибут RequireHttps (атрибут RequireHttpsAttps - новый в MVC2) для действия контроллера. Если атрибут RequireHttps не установлен И запрос находится под SSL, то верните результат перенаправления на URL-адрес, отличный от ssl. Таким образом, вам не нужно устанавливать оба атрибута контроллера, а затем помещать имя controller.action в другое место.
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 && !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);
}