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"和"管理员"组成。

我试图添加包含子句,但还没有运气。

asp.net mvc 标识的角色列表的 where 子句

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))