【问题标题】:How to turn off MVC.NET version 2's RequireHttps attribute?如何关闭 MVC.NET 版本 2 的 RequireHttps 属性?
【发布时间】:2010-12-09 18:24:03
【问题描述】:

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

编辑:我正在使用我自己的 RequireHttp 属性,它工作正常,但我想知道 MVC.NET 第 2 版中是否有一些我缺少的内置功能。

编辑2:我一定不清楚。我的问题涉及以下内容:如果您使用 RequireHttps,那么之后的任何请求都将通过 Https,即使 Controller 或 Action 没有使用 RequireHttps 装饰。除非我弄错了,否则您需要第二个属性(例如 RequireHttp)将请求重定向到 Http 而不是 Https。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    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);
        }
    }
    

    【讨论】:

    • @Bob,查看源代码,我认为没有RequireHttp 属性。所以是的,你将不得不自己动手。
    • 谢谢!这对我帮助很大。
    • RequireHttps 现在存在于 MVC 3 中:msdn.microsoft.com/en-us/library/…
    【解决方案2】:
    [RequireHttps] //apply to all actions in controller
    public class SomeController
    {
        //... or ...
        [RequireHttps] //apply to this action only
        public ActionResult SomeAction()
        {
        }
    }
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 连续请求不一定都在 HTTPS 上。他们将使用您的操作链接和表单中定义的方案,因此您可以在生成链接时设置所需的方案。
      • 回复:您在 2009 年 10 月 24 日发表的评论。谢谢 - 我没有想到只是从我的视图中重定向到链接中的 HTTP。
      • @bob 但您最终不会收到关于在某些浏览器中从安全连接更改为不安全连接的消息吗?
      【解决方案4】:

      它对我有用!

      我将 ç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

      【讨论】:

        猜你喜欢
        • 2014-02-11
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-13
        • 1970-01-01
        相关资源
        最近更新 更多