如何关闭MVC.NET版本2的RequireHttps属性?

时间:2009-10-24 17:18:17

标签: asp.net-mvc

我看到MVC.NET的第2版现在有一个RequireHttps属性,这对我很有用。然而,什么是关闭效果的好策略?例如,我想在某些页面上使用Https,但在其他页面上使用常规Http。我应该创建自己的RequireHttp属性吗?

编辑:我正在使用自己的RequireHttp属性,它工作正常,但我想知道MVC.NET版本2中是否存在一些我缺少的内置功能。<​​/ p> 编辑2:我一定不清楚。我的问题涉及以下内容:如果您使用RequireHttps,那么之后的任何请求都将超过Https,即使Controller或Action未使用RequireHttps进行修饰。除非我弄错了,否则你需要第二个属性,比如RequireHttp,才能将请求重定向到Http而不是Https。

4 个答案:

答案 0 :(得分:6)

ActionFilterAttribute的要点是您可以将它们应用于您想要的任何操作。或者换句话说,您不必将它们应用于所有操作。

如果您不希望将属性的逻辑注入到操作中,则只需将该属性应用于该操作即可。例如:

public class SomeController : Controller {
    [RequireHttps]
    public ActionResult SomeAction() {
        //the attribute's logic will be injected to this action.
        return View();
    }

    public ActionResult SomeOtherAction() {
        //this action doesn't require https protocol
        return View();
    }
}

如果您将该属性应用于控制器本身,则它将应用于控制器中的所有操作

修改

要求http协议而不是https,我想你可以使用下面的属性。 我会仔细检查MVC 2是否已经有了这个。但如果它没有(它没有):

public class RequireHttp : ActionFilterAttribute {
   public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (filterContext.HttpContext.Request.IsSecureConnection) {
            UriBuilder builder = new UriBuilder() {
                Scheme = "http",
                Host = filterContext.HttpContext.Request.Url.Host,
                Path = filterContext.HttpContext.Request.RawUrl
            };

            filterContext.Result = new RedirectResult(builder.ToString());
            filterContext.Result.ExecuteResult(filterContext);
        }
        base.OnActionExecuting(filterContext);
    }
}

答案 1 :(得分:1)

您可以在控制器上应用该属性,在这种情况下,它将应用于所有操作,或仅适用于所选操作。

//apply to all actions
[RequireHttps] 
public class SomeController 
{
    //apply to this action only
    [RequireHttps] 
    public ActionResult SomeAction()
    {
    }

}

答案 2 :(得分:1)

它对我有用!

我将çağdaş答案转换为 Visual Basic

Public Class RequireHttpAttribute
    Inherits ActionFilterAttribute

    Public Overrides Sub OnActionExecuting(ByVal filterContext As _
                                           ActionExecutingContext)
        If (filterContext.HttpContext.Request.IsSecureConnection) Then
            Dim builder As UriBuilder = New UriBuilder()
            builder.Scheme = "http"
            builder.Host = filterContext.HttpContext.Request.Url.Host
            builder.Path = filterContext.HttpContext.Request.RawUrl

            filterContext.Result = New RedirectResult(builder.ToString())
            filterContext.Result.ExecuteResult(filterContext)
        End If

        MyBase.OnActionExecuting(filterContext)
    End Sub

End Class

我这样用:

<RequireHttp()> _
Public Class SomeController

    <RequireHttp()> _
    Function SomeAction(...) As ActionResult
        ...
    End Function

End Class

我也在使用这里描述的Joel Mueller的 RemoteRequireHttps
ASP.NET MVC RequireHttps in Production Only

答案 3 :(得分:0)

[RequireHttps] //apply to all actions in controller
public class SomeController
{
    //... or ...
    [RequireHttps] //apply to this action only
    public ActionResult SomeAction()
    {
    }
}

在控制器级别应用它也会将其应用于所有操作方法,否则将其应用于每个单独的Action方法。