ASP.NET MVC [RequireHttps] - возврат в http - PullRequest
7 голосов
/ 21 февраля 2012

Как только вы поместите [RequireHttps] в действие и пользователь переключится с HTTP на HTTPS, все последующие ссылки останутся HTTPS ...

Есть ли способ вернуться к HTTP?

Ответы [ 3 ]

6 голосов
/ 21 февраля 2012

Технически, вы можете это сделать

Вы можете посмотреть на источник из RequireHttpsAttribute и повернуть его вспять.

На практике вам, вероятно, не следует

Если сеанс еще жив, обычно нецелесообразно возвращаться к HTTP .Это может быть основой для множества атак , например, перехват сеанса .

2 голосов
/ 21 февраля 2012

есть довольно подробное описание того, как обрабатывать переключение с HTTPS обратно на HTTP для конкретных методов действия по этой ссылке

http://blog.clicktricity.com/2010/03/switching-to-https-and-back-to-http-in-asp-net-mvc/

1 голос
/ 24 ноября 2013

Вот атрибут «ExitHttpsIfNotRequired», который я использую:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class RetainHttpsAttribute : Attribute
{
}

public class ExitHttpsIfNotRequiredAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        // Abort if it's not a secure connection  
        if (!filterContext.HttpContext.Request.IsSecureConnection) return;

        if (filterContext.ActionDescriptor.ControllerDescriptor.ControllerName == "sdsd") return;

        // Abort if it's a child controller
        if (filterContext.IsChildAction) return;

        // Abort if a [RequireHttps] attribute is applied to controller or action  
        if (filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Length > 0) return;
        if (filterContext.ActionDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Length > 0) return;

        // Abort if a [RetainHttps] attribute is applied to controller or action  
        if (filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(RetainHttpsAttribute), true).Length > 0) return;
        if (filterContext.ActionDescriptor.GetCustomAttributes(typeof(RetainHttpsAttribute), true).Length > 0) return;

        // Abort if it's not a GET request - we don't want to be redirecting on a form post  
        if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) return;

        // Abort if the error controller is being called - we may wish to display the error within a https page
        if (filterContext.ActionDescriptor.ControllerDescriptor.ControllerName == "Error") return;

        // No problems - redirect to HTTP
        string url = "http://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
        filterContext.Result = new RedirectResult(url);
    }
}
...