C# 角色列表的Where子句asp.net mvc标识

C# 角色列表的Where子句asp.net mvc标识,c#,asp.net-mvc,asp.net-identity,C#,Asp.net Mvc,Asp.net Identity,我有以下变量,用于选择当前登录用户所处的所有角色: var roles = ((ClaimsIdentity)User.Identity).Claims .Where(c => c.Type == ClaimTypes.Role) .Select(c => c.Value); 我希望能够筛选出这个列表中的角色,这些角色的开头是Club,结尾是Admin 角色由单词Club、clubs Id和Admin组成 我试着给它加上contains子句,但还没有成功 var r

我有以下变量,用于选择当前登录用户所处的所有角色:

var roles = ((ClaimsIdentity)User.Identity).Claims
    .Where(c => c.Type == ClaimTypes.Role)
    .Select(c => c.Value);
我希望能够筛选出这个列表中的角色,这些角色的开头是Club,结尾是Admin

角色由单词Club、clubs Id和Admin组成

我试着给它加上contains子句,但还没有成功

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

当然,您可以使用
声明
,但要获得当前的用户角色,还有一些其他的东西(更简单)

第一个是使用
UserManager
类,它是一个实例
IUserManager
接口。创建默认项目时,它将作为属性存储在控制器中。此类提供了许多有用的方法来处理用户帐户本身(创建、编辑、删除)以及用户角色(分配、取消分配和检索)。此外,使用此管理器,您可以1000%确定,如果有人在1秒前更改了用户角色,您将获得适当的用户角色始终

第二种方法是使用
用户
控制器属性的内置
IsInRole(字符串角色)
方法。如果当前登录的用户具有指定的角色,则返回true;否则返回false。这种方法有点“不稳定”,因为它依赖于
User
数据,这些数据是
IPrincipal
的一个实例,在用户登录时分配。更改当前用户角色(如果他当前已登录)只能在您为该用户提供注销权限,然后再次登录后进行。这是因为您需要将
IdentityUser
实例重新分配给当前
IPrincipal
。此外,对于
索赔
数组的
索赔
也是如此。但是,如果你确信这在你的系统中是不可能的,你可以忘记它

另外,如果您在角色枚举中定义了角色,那么最好为
用户创建自己的扩展方法,该方法将接受您的角色枚举值,而不是在每次调用内置
IsInRole()
时调用
ToString()

如果需要,您还可以用同样的方法创建自己的助手方法来检查角色

如果您喜欢使用
LINQ
查询,只需将
Where
表达式替换为以下表达式:

.Where(c => c.Type == ClaimTypes.Role && c.Value.StartsWith(startValeu) && c.Value.EndsWith(endValue))

StartsWith和EndsWith
谢谢,我还在学习,如何实现这些@MethodManvar角色=((ClaimsIdentity)User.Identity).Claims.Where(c=>c.Type==ClaimTypes.Role和&c.Value.StartsWith(“俱乐部”)和&c.Value.EndsWith(“管理”)。选择(c=>c.Value);谢谢@lyz只是工作谢谢@Scottley但那只会返回具有相同clubbid的,我需要所有的clubId,然后修改roleFilter.Equals检查为您需要的任何其他布尔操作。
.Where(c => c.Type == ClaimTypes.Role && c.Value.StartsWith(startValeu) && c.Value.EndsWith(endValue))