1

我有一個授權要求,使我的安全角色基於操作方法,這是使用默認的asp.net mvc授權無法實現的。所以我創建了以下行動過濾器,來實現我的自定義授權質量要求: -提高我的自定義授權模塊的性能和可擴展性

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
    public class CheckUserPermissionsAttribute : ActionFilterAttribute 
    { 
     Repository repository = new Repository(); 
     public string Model { get; set; } 
     public string Action { get; set; } 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      // var user = User.Identity.Name; // or get from DB 
      string ADusername = filterContext.HttpContext.User.Identity.Name.Substring(filterContext.HttpContext.User.Identity.Name.IndexOf("\\") + 1); 
      if (!repository.can(ADusername,Model,Action)) // implement this method based on your tables and logic 
      { 
       filterContext.Result = new HttpUnauthorizedResult("You cannot access this page"); 

      } 

      base.OnActionExecuting(filterContext); 
     } 
    } 

這是調用下面的存儲庫方法: -

public bool can(string user, string Model, string Action) 
     { 
      bool result; 
      bool result2; 


int size = tms.PermisionLevels.Where(a5 => a5.Name == Action).SingleOrDefault().PermisionSize; 
var securityrole = tms.SecurityroleTypePermisions.Where(a => a.PermisionLevel.PermisionSize >= size && a.TechnologyType.Name == Model).Select(a => a.SecurityRole).Include(w=>w.Groups).Include(w2=>w2.SecurityRoleUsers).ToList();//.Any(a=> a.SecurityRoleUsers.Where(a2=>a2.UserName.ToLower() == user.ToLower())); 

foreach (var item in securityrole) 
        { 
result = item.SecurityRoleUsers.Any(a => a.UserName.ToLower() == user.ToLower()); 
var no = item.Groups.Select(a=>a.TMSUserGroups.Where(a2=>a2.UserName.ToLower() == user.ToLower())); 
result2 = no.Count() == 1; 
if (result || result2) 
{ 
    return true; 
}} 
return false; 

我打電話我的控制器類裏面的動作過濾器如下: -

[CheckUserPermissions(Action = "Read", Model = "Server")] 

,但我有以下的憂慮: -

  1. 我的倉庫中我將檢索所有用戶和組(當調用.Tolist())時,然後檢查當前登錄用戶是否在這些值內。這在處理大量用戶時不會很好擴展?

  2. 每當用戶調用一個操作方法時,同一個安全代碼將運行(當然用戶權限可能會在用戶會話期間進行),這可能會導致性能問題?

因此,任何人都可以不知道如何改進我目前的實施,考慮到兩個問題? 謝謝

回答

1

我會改變你的方法,並使用基於聲明的身份驗證。

通過這種方式,您可以對授權進行更精細的控制(它可以由資源和操作驅動)。

您可以使用ClaimsAuthorizationManager檢查中心位置的每個級別的訪問權限。

本文將介紹如何實現此功能,並且還會使用安全會話票據來保存每次訪問數據庫的權限。

http://dotnetcodr.com/2013/02/25/claims-based-authentication-in-mvc4-with-net4-5-c-part-1-claims-transformation/

+0

說實話這將需要很長的時間,我chnage我目前的做法,因爲我沒有上要求授權之前工作。我知道我目前的做法並不是最好的,但我正在努力盡可能地改進它。感謝 –

+0

沒問題,值得在閱讀那篇文章的時候儘可能多的時間。祝你好運。 – hutchonoid

+0

抱歉,我忘記了包含存儲庫類代碼。我已更新我的原始帖子。 –