Как выйти из режима 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.