Как выйти из режима https в http в asp.net mvc

Я включил страницу входа в систему как Https, добавив атрибут [RequireSSL] в Action контроллера, и он работает нормально. Но после успешного входа он остается в среде https, однако страница не является страницей https. Кто-нибудь может дать мне обходной путь, как выйти из режима https в режим http? Любая помощь в этом отношении будет принята с благодарностью.

3 ответа

ВНИМАНИЕ: У меня был похожий вопрос. Одна важная вещь, которую я узнал, состояла в том, что ваш файл cookie будет передаваться поверх простого текста после переключения обратно на HTTP. Смотрите это.

ВНИМАНИЕ 2: Не забудьте учесть, что вас страшно. Вы собираетесь быть перенаправлены на соединение, которое не является безопасным сообщением.

Если вы пишете банковское приложение, вам нужно быть очень осторожным, а также осознавать растущее число пользователей общедоступных Wi-Fi-соединений, которые вполне могут быть направлены через какой-то подлый прокси. Вероятно, гораздо большее беспокойство о главных сайтах, но беспокойство о нас всех, чтобы знать.

Смотрите также мой другой вопрос (нет ответов на момент написания - но тогда я только что задал его!)

В основном вам нужно сделать обратное, которое имеет атрибут [DoesNotRequireSSL], который эффективно выполняет противоположное действие атрибута {RequireSSL], то есть перенаправляет на протокол http

public class DoesNotRequireSSL: ActionFilterAttribute 
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext) 
        {
            var request = filterContext.HttpContext.Request;
            var response = filterContext.HttpContext.Response;

            if (request.IsSecureConnection && !request.IsLocal) 
            {
            string redirectUrl = request.Url.ToString().Replace("https:", "http:");
            response.Redirect(redirectUrl);
            }
            base.OnActionExecuting(filterContext);
        }
    }

Кроме того, если вы хотите, чтобы такое поведение выполнялось на нескольких страницах, вы можете настроить базовый контроллер, от которого могут наследоваться все ваши контроллеры, не относящиеся к http, чтобы вам не пришлось беспокоиться о необходимости повторяться для каждой страницы, для которой требуется этот.

Я знаю, что это довольно старый вопрос, но многие из представленных выше ссылок устарели, и этот код обращается к нему для ASP.NET MVC 5 путем внесения некоторых небольших изменений в RequireHttpsAttribute это входит в пространство имен System.Web.Mvc:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class ForbidHttpsAttribute : FilterAttribute, IAuthorizationFilter
{
    public virtual void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (filterContext.HttpContext.Request.IsSecureConnection)
        {
            HandleHttpsRequest(filterContext);
        }
    }

    protected virtual void HandleHttpsRequest(AuthorizationContext filterContext)
    {
        // only redirect for GET requests, otherwise the browser might not propagate the verb and request
        // body correctly.

        if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
        {
            throw new InvalidOperationException("The requested resource can only be accessed *without* SSL.");
        }

        // redirect to HTTP version of page
        var url = "http://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
        filterContext.Result = new RedirectResult(url);
    }
}

Код взят из этой статьи, в которой кратко обсуждаются некоторые проблемы безопасности, связанные с принудительным перенаправлением пользователей с HTTPS на HTTP.

Другие вопросы по тегам