1

我目前正在研究過濾器[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; 
    } 
} 

但有問題。每次我詢問有關權限的數據庫,這個恕我直言並不是最好的方式。現在我的想法是獲得一個用戶的所有權限,並在授權時讓他進入他的會話。也許我錯了,這種方式會造成問題,但保留在數據庫中,並一直問有關權限也不是好主意:)。那麼在數據庫只有一兩個問題後,也許更好的方法來獲取數據並用於代碼?

回答

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; 
} 

這會給你允許的角色給定的控制/動作,從緩存第二個請求。

+1

似乎完美的工作! – 2012-03-19 13:54:37

相關問題