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

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

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

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

Спасибо.

8
задан goombaloon 10 March 2010 в 03:31
поделиться

2 ответа

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

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

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

1
ответ дан 6 December 2019 в 00:55
поделиться

В своем классе 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);
}
1
ответ дан 6 December 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: