我有一個授權要求,使我的安全角色基於操作方法,這是使用默認的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")]
,但我有以下的憂慮: -
我的倉庫中我將檢索所有用戶和組(當調用.Tolist())時,然後檢查當前登錄用戶是否在這些值內。這在處理大量用戶時不會很好擴展?
每當用戶調用一個操作方法時,同一個安全代碼將運行(當然用戶權限可能會在用戶會話期間進行),這可能會導致性能問題?
因此,任何人都可以不知道如何改進我目前的實施,考慮到兩個問題? 謝謝
說實話這將需要很長的時間,我chnage我目前的做法,因爲我沒有上要求授權之前工作。我知道我目前的做法並不是最好的,但我正在努力盡可能地改進它。感謝 –
沒問題,值得在閱讀那篇文章的時候儘可能多的時間。祝你好運。 – hutchonoid
抱歉,我忘記了包含存儲庫類代碼。我已更新我的原始帖子。 –