代码之家  ›  专栏  ›  技术社区  ›  André Miranda

在ASP.NET MVC ActionFilter中检查用户的详细信息

  •  0
  • André Miranda  · 技术社区  · 17 年前

    假设我不想使用成员资格,并且想用actionfilter限制用户的访问。

    我知道我可以创建一个filter/属性并重写onActionExecuting方法,而且我还可以将这个属性放入一个ActionResult中。

    假设我有一个名为'tbusers'的表,它还有一个名为'certificate'的int字段,根据这个'certificate'值,用户是否可以访问actionresult。

    但是,如何在onActionExecutingMeHod中检查此用户的“certificate”值并授予其访问权限或重定向到“notallowed.aspx”页面?

    谢谢!!!

    2 回复  |  直到 17 年前
        1
  •  4
  •   Haacked    17 年前

    我不会这样做的。我会实施一个 IAuthorizationFilter .授权筛选器在所有操作筛选器之前运行。

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

        2
  •  1
  •   tvanfosson    17 年前

    ActionExecutingContext具有包含当前用户对象的HttpContext。你可以用这个来获取用户。如果要在会话中存储信息,也可以使用它来访问会话。你也可以把它放在一个加密的cookie中,并通过上下文中的request.cookies访问这些cookie。你应该考虑一下它的安全含义,尽管我认为它没有auth cookie更麻烦。

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

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