继承或覆盖控制器以检查用户角色

时间:2012-08-18 17:13:00

标签: asp.net asp.net-mvc roleprovider

我的函数返回true或false取决于UserID和User Role。

我有控制器有几个动作结果。

例如

  public class DemoController : Controller
  {
     public ActionResult Index(){}

     public ActionResult Contact(){}
  }

每当用户使用此操作时,我都希望检查用户是否在角色中。

我知道我可以像

那样
[Authorize(Roles = "Administrator")]
public ActionResult JustAdmins(){}

但是这种方式,每次用户访问此操作时,都会产生额外的SQL查询。

我想在MemCached中存储用户角色,所以我的功能就像

 public static bool IsCompany(Guid UserID)
 {

    //if (get from cache != null && get from cache == "Role")
    // return true
    //if (get from DB != null && get from DB == "Role")
    //return true

    return false;
 }

但是如何在我的控制器中继承所有Action以检查此功能?

提示:可能会覆盖OnActionExecuting或类似的?

1 个答案:

答案 0 :(得分:1)

您可以编写从默认值继承的自定义RoleProvider并覆盖GetRolesForUser方法:

public class CachingRoleProvider: THE_ROLE_PROVIDER_YOU_ARE_CURRENTLY_USING
{
    public override string[] GetRolesForUser(string username)
    {
        string[] roles;
        if (TryCheckFromYourCacheIfUserIsInRole(username, out roles))
        {
            // the roles for this user were retrieved from the cache
            return roles;
        }

        // no roles retrieved from the cached => query the base role provider
        roles = base.GetRolesForUser(username);

        // Store the retrieved roles into the cache so that on subsequent calls
        // you no longer need hit the base role provider for this user
        PutRoleInCacheForUser(username, roles);

        return roles;
    }
}

显然,通过执行此操作,您完全承认,如果某个外部进程修改了基本角色提供程序使用的数据存储区中的角色,您可能会失去同步,因为现在您正在读取缓存的角色,而不是数据存储区中的角色。 。因此,在这种情况下,您可能需要设置一些同步机制来驱逐给定用户名的缓存数据。