我目前正在研究過濾器[Authorize]的擴展,以便我可以從數據庫檢索權限。一切正常,但它肯定是一個性能問題。每次我向數據庫發送一個查詢請求許可,這都不是確定這個問題的最好方法。所以我想把這些數據放在Session中。將數據庫中的數據放入我可以問的Session對象(LINQ)以及數據庫的最快方法是什麼?將數據從數據庫中放入MVC中的會話
現在這個樣子:
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尋求幫助。
大局觀
確定。我會展示更大的圖片。 整個想法是創建自定義授權過濾器。
[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;
}
}
但有問題。每次我詢問有關權限的數據庫,這個恕我直言並不是最好的方式。現在我的想法是獲得一個用戶的所有權限,並在授權時讓他進入他的會話。也許我錯了,這種方式會造成問題,但保留在數據庫中,並一直問有關權限也不是好主意:)。那麼在數據庫只有一兩個問題後,也許更好的方法來獲取數據並用於代碼?
似乎完美的工作! – 2012-03-19 13:54:37