【问题标题】:Where clause for list of roles asp.net mvc identity角色列表 asp.net mvc 身份的 Where 子句
【发布时间】:2016-01-08 07:28:46
【问题描述】:

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

var roles = ((ClaimsIdentity)User.Identity).Claims
    .Where(c => c.Type == ClaimTypes.Role)
    .Select(c => c.Value);

我希望能够过滤此列表,以筛选出以 Club 开头和 Admin 结尾的角色。

角色由单词 Club、俱乐部 ID 和管理员组成。

我尝试在其中添加包含子句,但目前还没有成功。

【问题讨论】:

  • StartsWith and EndsWith
  • 谢谢,我还在学习,如何实现这些? @MethodMan
  • var roles = ((ClaimsIdentity)User.Identity).Claims .Where(c => c.Type == ClaimTypes.Role && c.Value.StartsWith("Club") && c.Value .EndsWith("Admin")) .Select(c => c.Value);
  • 感谢@lyz 的工作

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


【解决方案1】:
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 选项。

【讨论】:

  • 感谢@Scottley,但这只会返回具有相同俱乐部 ID 的人,我需要所有俱乐部 ID
  • 然后只需将 roleFilter.Equals 检查修改为您需要的任何其他布尔操作。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    第二种是使用User控制器属性的内置IsInRole(string role)方法。如果当前登录的用户具有指定的角色,则返回 true,否则返回 false。这种方法有点“不稳定”,因为它依赖于User 数据,它是IPrincipal 的一个实例,并在您的用户登录时分配。如果他当前登录,则可以更改当前用户角色 只有在您让该用户退出并重新登录后才能让他重新登录。这是因为您需要将IdentityUser 实例的实例重新分配给当前IPrincipal。此外,对于ClaimsIdentityClaims 数组也是如此。但是,如果您确定这在您的系统中是不可能的 - 您可以忘记它。

    此外,如果您在角色枚举中定义了您的角色,最好为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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2016-09-05
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      • 2018-05-27
      相关资源
      最近更新 更多