我目前正在处理过滤器[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被授权时将他放入他的会话中。也许我错了,这种方式会产生问题,但保留在数据库中并且一直询问权限也不是好主意:)。那么在对数据库只有一两个问题之后,可能更好的方法是在数据中使用数据并使用它?
答案 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;
}
这将从第二个请求的缓存中为您提供给定控件/操作的允许角色。