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

时间:2009-08-06 13:39:38

标签: asp.net-mvc

假设我不想使用成员资格,并希望通过ActionFilter限制用户的访问权限。

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

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

public MyFilter() : this(null) { }