Asp.net mvc 为什么一旦在操作级别使用[RequireHttps]启用SSL,它将永远保持启用状态?

Asp.net mvc 为什么一旦在操作级别使用[RequireHttps]启用SSL,它将永远保持启用状态?,asp.net-mvc,iis-7,https,Asp.net Mvc,Iis 7,Https,我们只希望在严格要求时使用https。为什么在调用下面这样的操作后,它将永远处于启用状态 [RequireHttps] public ActionResult LogIn() { if(Request.IsAuthenticated) return RedirectToAction("Index", "Account"); return View(); } 在不需要时,我们可以做些什么来禁用它 谢谢。我使

我们只希望在严格要求时使用https。为什么在调用下面这样的操作后,它将永远处于启用状态

    [RequireHttps]
    public ActionResult LogIn()
    {
        if(Request.IsAuthenticated)
            return RedirectToAction("Index", "Account");

        return View();
    }
在不需要时,我们可以做些什么来禁用它


谢谢。

我使用此操作筛选器,在https操作完成时重定向回http:

using System.Web.Mvc;
using System;
public class ExitHttpsIfNotRequiredAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        // abort if it's not a secure connection
        if (!filterContext.HttpContext.Request.IsSecureConnection) 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;

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

我使用此操作筛选器在https操作完成时重定向回http:

using System.Web.Mvc;
using System;
public class ExitHttpsIfNotRequiredAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        // abort if it's not a secure connection
        if (!filterContext.HttpContext.Request.IsSecureConnection) 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;

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

[RequireHttps]属性可用于控制器类型或操作方法,表示只能通过SSL访问。对于控制器或操作的非SSL请求将在HTTP GET时重定向到SSL版本,或者在HTTP POST时被拒绝。如果愿意,可以重写RequireHttpAttribute并更改此行为。没有内置的[RequireHttp]属性可以起到相反的作用,但是如果需要,您可以轻松地创建自己的属性

还有Html.ActionLink的重载,它采用协议参数;您可以显式指定http或https作为协议。这是一个关于超负荷的例子。如果未指定协议或调用没有协议参数的重载,则假定希望链接与当前请求具有相同的协议

我们在MVC中没有[RequireHttp]属性的原因是它实际上没有多少好处。它没有[RequireHttps]有趣,它鼓励用户做错事。例如,许多网站通过SSL登录,并在登录后重定向回HTTP,这绝对是错误的。您的登录cookie与您的用户名+密码一样保密,现在您正在通过网络以明文形式发送它。此外,在MVC管道运行之前,您已经花时间执行握手和保护通道,这是HTTPS比HTTP慢的主要原因,因此[RequireHTTPP]不会使当前请求或未来请求快很多

如果您正在托管utube,请将嵌入更改为使用HTTPS而不是HTTP
如果您在未正确注销的情况下从HTTPS下拉到HTTP,请查看您的用户名+密码是完全开放的。仅调用SignOut是不够的。

可以在控制器类型或操作方法上使用[RequireHttps]属性来表示只能通过SSL访问。对于控制器或操作的非SSL请求将在HTTP GET时重定向到SSL版本,或者在HTTP POST时被拒绝。如果愿意,可以重写RequireHttpAttribute并更改此行为。没有内置的[RequireHttp]属性可以起到相反的作用,但是如果需要,您可以轻松地创建自己的属性

还有Html.ActionLink的重载,它采用协议参数;您可以显式指定http或https作为协议。这是一个关于超负荷的例子。如果未指定协议或调用没有协议参数的重载,则假定希望链接与当前请求具有相同的协议

我们在MVC中没有[RequireHttp]属性的原因是它实际上没有多少好处。它没有[RequireHttps]有趣,它鼓励用户做错事。例如,许多网站通过SSL登录,并在登录后重定向回HTTP,这绝对是错误的。您的登录cookie与您的用户名+密码一样保密,现在您正在通过网络以明文形式发送它。此外,在MVC管道运行之前,您已经花时间执行握手和保护通道,这是HTTPS比HTTP慢的主要原因,因此[RequireHTTPP]不会使当前请求或未来请求快很多

如果您正在托管utube,请将嵌入更改为使用HTTPS而不是HTTP
如果您在未正确注销的情况下从HTTPS下拉到HTTP,请查看您的用户名+密码是完全开放的。仅调用注销是不够的。

Nice,如果我导航到网站中的某个静态*.HTM页面,会发生什么情况?您将使用重定向方法导航到HTM页面,以便您可以指示http url。谢谢。你说的重定向方法是什么意思?这是与MVC相关的吗?标准http重定向,与MVCIt无关,可以在类级别使用:D太好了,如果我导航到网站中的某个静态*.HTM页面会发生什么?您将使用重定向方法导航到HTM页面,以便您可以指示http url。谢谢。你说的重定向方法是什么意思?它是否与MVC相关?标准http重定向,与MVCIt无关,可以在类级别使用:D,太好了,为什么您认为不需要它?您的登录cookie与您的用户名+密码一样保密,现在您正在通过网络以明文形式发送它。此外,您已经花了一些时间来执行握手并保护大容量通道
在MVC管道运行之前,是什么让HTTPS比HTTP慢,所以[RequireHttp]不会使当前请求或将来的请求更快。我想关闭它,因为我们在同一页面上也托管了一些youtube电影,IE总是说:只显示安全内容并阻止youtube电影…所以将嵌入更改为https www.youtube.com我认为不可能,因为这取决于用户是否已登录,我需要通过http或https嵌入…如果您未正确注销就从https下拉到http,请查看您的用户名+密码是否为所有人打开。为什么您认为不需要它?您的登录cookie与您的用户名+密码一样保密,现在您正在通过网络以明文形式发送它。此外,在MVC管道运行之前,您已经花时间执行握手并保护通道,这是HTTPS比HTTP慢的主要原因,因此[RequireHTTPP]不会使当前请求或将来的请求更快。我想关闭它,因为我们在同一页面上也托管了一些youtube电影,IE总是说:只显示安全内容并阻止youtube电影…所以将嵌入更改为https www.youtube.com我认为不可能,因为这取决于用户是否已登录,我需要通过http或https嵌入…如果您未正确注销就从https下拉到http,请查看您的用户名+密码。Rick,您的评论很有意义。我还阅读了注销链接。如果我去Amazon和Newegg这样的网站,我注意到它们在我登录时根据我访问的页面在HTTP和HTTPS之间切换。这是一个安全漏洞还是他们在使用其他技术?他们这样做是为了提高绩效吗?在页面上使用HTTPS的影响有多大?Rick,你的评论很有道理。我还阅读了注销链接。如果我去Amazon和Newegg这样的网站,我注意到它们在我登录时根据我访问的页面在HTTP和HTTPS之间切换。这是一个安全漏洞还是他们在使用其他技术?他们这样做是为了提高绩效吗?对页面使用HTTPS的影响有多大?