Переключение между HTTP и HTTPS в ASP.NET MVC 1.0 - PullRequest
8 голосов
/ 10 марта 2010

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

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

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

Спасибо.

Ответы [ 4 ]

1 голос
/ 20 августа 2010

В вашем классе ControllerBase вы можете переопределить Controller.OnAuthorization, а затем проверить, установлен ли атрибут RequireHttps (RequireHttpsAttribute является новым в 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 голос
/ 16 января 2012

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

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

1 голос
/ 10 марта 2010

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

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

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

0 голосов
/ 17 января 2012

Я использовал этот код на Controller.OnAturhotification.

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

Response.ApplyAppPathModifier - поддержка сеанса без файлов cookie.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...