where子句用于asp.net mvc身份的角色列表

时间:2016-01-07 22:21:44

标签: c# asp.net-mvc asp.net-identity

我有以下变量,它选择当前用户签名的所有角色:

var myInterval = false;
$('#backwardBtn').mouseover(function(){
    $('#rollerSelector').trigger('backward');
    myInterval = setInterval(function(){
       $('#rollerSelector').trigger('backward');
    }, 1000);
}).mouseout(function() {
   clearInterval(myInterval);
   myInterval = false;
    $('#rollerSelector li:first-child').addClass('rollerFirst');
    $('#rollerSelector li:nth-child(2)').addClass('rollerSecond');
});

我希望能够仅针对开头有Club的角色和最后有Admin的角色过滤此列表。

角色由俱乐部,俱乐部Id和管理员组成。

我已经尝试添加包含条款,但还没有运气。

3 个答案:

答案 0 :(得分:0)

{{1}}

可选地,如果需要,可以在等式检查中使用StringComparison IgnoreCase选项。

答案 1 :(得分:0)

感谢@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);

答案 2 :(得分:0)

当然,您可以使用Claims,但还有其他一些(并且更简单)来获取当前用户角色。

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

第二个是使用IsInRole(string role)控制器的内置User方法&#39;属性。如果当前登录的用户具有指定的角色,则返回true,否则返回false。这种方法有点不稳定&#34;因为它依赖于User数据,这是IPrincipal的一个实例,并在您的用户登录时分配。如果当前已登录,则更改当前用户角色只能在之后进行39;给这个用户注销,然后再次登录。这是因为您需要将IdentityUser实例的实例重新分配给当前IPrincipal。此外,Claims ClaimsIdentity数组也是如此。但如果您确定在您的系统中无法做到这一点 - 您可以忘掉它。

此外,如果您在角色枚举中定义了角色,则最好为User创建自己的扩展方法,该方法将获取您的角色枚举值,而不是在每次调用内置ToString()时调用IsInRole() 1}}:

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))
相关问题