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