我应该如何检查用户在视图中的角色?
How should I check the user's roles in a view?
我正在检查 _LoginPartial.cshtml
中登录用户的角色,以根据角色更改设计元素。
这是一个好的方法,还是有更好的方法?
int ix = User.IsInRole("SiteAdmin")
? 0
: User.IsInRole("SysOp")
? 1
: User.IsInRole("SupportAgent")
? 2
: User.IsInRole("GroupAdmin")
? 3
: User.IsInRole("GroupUser")
? 4
: 5;
然后我在 string[]
btnDesign[]
:
中使用 ix
作为索引器
class="btn @(btnDesign[ix])"
我知道我的检查可能会导致五次单独访问数据库,这就是我问这个问题的原因。
更新
我已经"optimized"咯。看到 "GroupUser" 的数量多于 "SiteAdmin" 的数量,我将检查放在首位(并删除了一个角色,SupportAgent):
int ix = User.IsInRole("GroupUser")
? 0
: User.IsInRole("GroupAdmin")
? 1
: User.IsInRole("SysOp")
? 2
: User.IsInRole("SiteAdmin")
? 3
: 4;
现在,对于大多数已登录用户("GroupUser"s)来说,检查可能会尽可能快。
不过,我想知道是否可以进一步改进它。
您可以在字典中某个方便的地方定义角色到索引的映射:
var roleMapping = new Dictionary<string,int>();
roleMapping.Add("SiteAdmin", 0);
...
在您的代码中,您可以在一次调用中检索用户的所有角色:
var idUser = UserManager.GetUserAsync(User).Result;
var roles = UserManager.GetRolesAsync(idUser).Result;
现在,确定 "most significant" 索引,考虑用户通过
拥有的角色
int significantIndex = roleMapping
.Where(kv => roles.Contains(kv.Key))
.Select(kv => kv.Value)
.Min();
此处假定具有最低值的索引是当前用户的最佳匹配。
我正在检查 _LoginPartial.cshtml
中登录用户的角色,以根据角色更改设计元素。
这是一个好的方法,还是有更好的方法?
int ix = User.IsInRole("SiteAdmin")
? 0
: User.IsInRole("SysOp")
? 1
: User.IsInRole("SupportAgent")
? 2
: User.IsInRole("GroupAdmin")
? 3
: User.IsInRole("GroupUser")
? 4
: 5;
然后我在 string[]
btnDesign[]
:
ix
作为索引器
class="btn @(btnDesign[ix])"
我知道我的检查可能会导致五次单独访问数据库,这就是我问这个问题的原因。
更新 我已经"optimized"咯。看到 "GroupUser" 的数量多于 "SiteAdmin" 的数量,我将检查放在首位(并删除了一个角色,SupportAgent):
int ix = User.IsInRole("GroupUser")
? 0
: User.IsInRole("GroupAdmin")
? 1
: User.IsInRole("SysOp")
? 2
: User.IsInRole("SiteAdmin")
? 3
: 4;
现在,对于大多数已登录用户("GroupUser"s)来说,检查可能会尽可能快。
不过,我想知道是否可以进一步改进它。
您可以在字典中某个方便的地方定义角色到索引的映射:
var roleMapping = new Dictionary<string,int>();
roleMapping.Add("SiteAdmin", 0);
...
在您的代码中,您可以在一次调用中检索用户的所有角色:
var idUser = UserManager.GetUserAsync(User).Result;
var roles = UserManager.GetRolesAsync(idUser).Result;
现在,确定 "most significant" 索引,考虑用户通过
拥有的角色int significantIndex = roleMapping
.Where(kv => roles.Contains(kv.Key))
.Select(kv => kv.Value)
.Min();
此处假定具有最低值的索引是当前用户的最佳匹配。