将数据从数据库放入MVC中的Session

时间:2012-03-19 10:36:28

标签: asp.net-mvc database entity-framework session authorize-attribute

我目前正在处理过滤器[Authorize]的扩展,以便我可以从数据库中检索权限。一切正常,但肯定是性能问题。每次我向数据库发送查询,请求权限,这不是确定这一点的最佳方法。所以我想把这些数据放在Session中。将数据从数据库放入Session对象的最快方法是什么(LINQ)以及数据库。

现在看起来像:

var _allowedRolesDB = context.sec_RolesInCAs
                .Where(rl => rl.MenuControlName == controllRights && rl.MenuActionName == actionRights)
                .Select(rl => rl.RoleName);

            foreach (var r in _allowedRolesDB)
            {
                RolesDB = RolesDB + r.ToString() + ",";
            }

但我想改变

var _allowedRolesDB = MySuperSessionSomethink
.Where(rl => rl.MenuControlName == controllRights && rl.MenuActionName == actionRights)
                .Select(rl => rl.RoleName);

            foreach (var r in _allowedRolesDB)
            {
                RolesDB = RolesDB + r.ToString() + ",";
            }

MySuperSessionSomethink将保留从数据库中一次性检索的数据。知道我怎么能这样做吗? Tx寻求帮助。


BIGGER PICTURE

确定。我会展示更大的图片。 整个想法是创建自定义授权过滤器。

    [CustomAuthAttribute("Home,Index", Roles = "SuperAdministrator")]
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";

        return View();
    }

这是什么目标。创建具有所有优点的授权属性,以及其他功能,例如保留有关数据库权限的信息。

现在我做的是:

public CustomAuthAttribute(params string[] controllerAction)
{
        IPrincipal user = HttpContext.Current.User;
        string userName = user.Identity.Name;
        **... some code .. and take all allowed roles and check it have permissions** 
        var _allowedRolesDB = context.sec_RolesInCAs
            .Where(rl => rl.MenuControlName == controllRights && rl.MenuActionName == actionRights)
            .Select(rl => rl.RoleName);

        foreach (var r in _allowedRolesDB)
        {
            RolesDB = RolesDB + r.ToString() + ",";
        }
        **... some code .. thesame withs single users**

}

在此之后我使用

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
   **... can acces or not part of code ...**
   if (_rolesSplit.Any(user.IsInRole))
   {
        return true;
    }
}

但是有问题。每次我问数据库有关权限,这恕我直言不是最好的方法。现在我的想法是获取一个用户的所有权限,并在hi被授权时将他放入他的会话中。也许我错了,这种方式会产生问题,但保留在数据库中并且一直询问权限也不是好主意:)。那么在对数据库只有一两个问题之后,可能更好的方法是在数据中使用数据并使用它?

1 个答案:

答案 0 :(得分:0)

首先,您似乎希望将这些添加到缓存中,而不是会话中。它们似乎是应用程序的全局,而不是特定于用户。由于您通过菜单控件/操作查找角色,我只是将它们作为查找添加到缓存中:

string action = controlRights + actionRights;
string allowedRoles = Cache[action];
if (allowedRoles == null) 
{
    allowedRoles = String.Join(",", context.sec_RolesInCAs
        .Where(rl => rl.MenuControlName == controlRights && rl.MenuActionName == actionRights)
        .Select(rl => rl.RoleName)
        .ToArray());
    Cache[action] = allowedRoles;
}

这将从第二个请求的缓存中为您提供给定控件/操作的允许角色。