Asp.net mvc 检查用户';ASP.NET MVC ActionFilter中的详细信息

Asp.net mvc 检查用户';ASP.NET MVC ActionFilter中的详细信息,asp.net-mvc,Asp.net Mvc,假设我不想使用成员资格,而是想通过ActionFilter限制用户的访问权限 我知道我可以创建一个过滤器/属性并重写OnActionExecuting方法,然后我可以将该属性放入ActionResult中 假设我有一个名为“tbUsers”的表,它还有一个名为“certificate”的int字段,根据这个“certificate”值,用户可以访问或不访问ActionResult 但是,在OnActionExecuting方法中,如何检查此用户的“证书”值并授予其访问权限或重定向到“NotAll

假设我不想使用成员资格,而是想通过ActionFilter限制用户的访问权限

我知道我可以创建一个过滤器/属性并重写OnActionExecuting方法,然后我可以将该属性放入ActionResult中

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

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


谢谢

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

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

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


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

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

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