asp.net mvc 标识的角色列表的 where 子句
本文关键字:列表 where 子句 角色 asp mvc 标识 net | 更新日期: 2023-09-27 18:29:22
我有以下变量,用于选择当前登录用户所在的所有角色:
var roles = ((ClaimsIdentity)User.Identity).Claims
.Where(c => c.Type == ClaimTypes.Role)
.Select(c => c.Value);
我希望能够过滤此列表,仅列出开头有俱乐部,最后有管理员的角色。
角色由单词"俱乐部"、"俱乐部 ID"和"管理员"组成。
我试图添加包含子句,但还没有运气。
var roleFilter = string.Format("Club{0}Admin", clubId);
var roles = ((ClaimsIdentity)User.Identity).Claims
.Where(c => c.Type == ClaimTypes.Role && roleFilter.Equals(c.Value)
.Select(c => c.Value);
或者,如果需要,可以在相等性检查中使用 StringComparison IgnoreCase 选项。
感谢@lyz的回答:
var roles = ((ClaimsIdentity)User.Identity).Claims
.Where(c => c.Type == ClaimTypes.Role && c.Value.StartsWith("Club") && c.Value.EndsWith("Admin"))
.Select(c => c.Value);
好吧,当然,您可以使用Claims
,但是还有其他一些事情(并且更简单(来获取当前用户角色。
第一个是使用UserManager<TUser>
类,它是一个实例IUserManager<TUser>
接口。创建默认项目时,它作为属性存储在控制器中。此类有很多有用的方法来处理用户帐户本身(创建,编辑,删除(以及用户角色(分配,取消分配和检索它们(。此外,使用此管理器,您可以 1000% 确定,如果有人在 1 秒前更改了用户角色,您将始终获得适当的用户角色
第二种是使用内置IsInRole(string role)
User
控制器属性的方法。如果当前登录的用户具有指定的角色,则返回 true,如果没有,则返回 false。这种方法有点"不稳定",因为它依赖于User
数据,这些数据是IPrincipal
的实例,并在用户登录时分配。如果当前用户当前已登录,则只有在您为此用户提供注销权限,然后再次登录后,才能更改当前用户角色。这是因为您需要将IdentityUser
实例的实例重新分配给当前IPrincipal
。此外,对于Claims
ClaimsIdentity
数组也是如此。但是,如果您确定这在您的系统中是不可能的 - 您可以忘记它。
此外,如果您在角色枚举中定义了角色,则最好为User
创建自己的扩展方法,该方法将获取您的角色枚举值,而不是在每次调用内置IsInRole()
时调用ToString()
:
public static bool IsInRole(this IPrincipal principal, RolesEnum value)
{
return principal.IsInRole(value.ToString());
}
如果需要,也可以以相同的方式创建自己的帮助程序方法来检查角色。
如果您更喜欢使用LINQ
查询,只需将Where
表达式替换为以下内容:
.Where(c => c.Type == ClaimTypes.Role && c.Value.StartsWith(startValeu) && c.Value.EndsWith(endValue))