【问题标题】:Check user's details in ASP.NET MVC ActionFilter在 ASP.NET MVC ActionFilter 中检查用户的详细信息
【发布时间】:2009-08-06 13:39:38
【问题描述】:

假设我不想使用 Membership 并且想通过 ActionFilter 限制用户的访问。

我知道我可以创建一个过滤器/属性并覆盖 OnActionExecuting 方法,而且我还可以将此属性放在 ActionResult 中。

假设我有一个名为 'tbUsers' 的表,它还有一个名为 'certificate' 的 int 字段,并且根据这个 'certificate' 值,用户可以访问或不访问 ActionResult。

但是,我如何在 OnActionExecuting 方法中检查此用户的“证书”值并授予他访问权限或重定向到“NotAllowed.aspx”页面?

谢谢!!!

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    我不会这样做。我会实现一个IAuthorizationFilter。授权过滤器在所有操作过滤器之前运行。

    例如,假设您稍后在操作方法上放置了一个 OutputCache 属性,并且它恰好在您的身份验证过滤器之前运行。那会很糟糕!如果内容被缓存,身份验证过滤器将永远不会运行,人们会看到缓存的敏感数据。

    【讨论】:

      【解决方案2】:

      ActionExecutingContext 具有包含当前用户对象的 HttpContext。您可以使用它来获取用户。如果您想将信息存储在 Session 中,也可以使用它来访问 Session。您还可以将其放入加密的 cookie 中,并通过上下文中的 Request.Cookies 访问它们。你会想考虑它的安全隐患,尽管我认为它并不比 auth cookie 更成问题。

      对照数据库检查它并维护过滤器的可测试性有点棘手。我所做的是为每个过滤器类提供两个构造函数。一个提供了一个数据库工厂,它将创建我的数据上下文。我在测试中使用它并提供一个模拟数据库工厂来生成模拟或假数据库。普通的无参数构造函数使用空工厂调用前一个构造函数。当这种情况发生时,另一个构造函数会创建一个默认工厂的新实例。

      private IDatabaseFactory Factory { get; set; }
      public MyFilter( IDatabaseFactory factory )
      {
           this.Factory = factory ?? new DefaultDatabaseFactory();
      }
      
      public MyFilter() : this(null) { }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        相关资源
        最近更新 更多