2016-01-07 3 views
0

У меня есть следующая переменная, которая выбирает все роли в настоящее время подписан в пользователя находится в:Где пункт для списка ролей ASP.NET MVC идентичности

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

я хочу, чтобы иметь возможность фильтровать этот список для всего роли, которые имеют Club в начале и Admin в конце.

Роли состоят из слова «Клуб», «Идентификаторы клубов» и «Админ».

Ive пытался добавить содержит предложения к нему еще не повезло.

+0

'StartsWith и EndsWith' – MethodMan

+0

Спасибо, я все еще учусь, как я реализовать их? @MethodMan –

+1

var role = ((ClaimsIdentity) User.Identity) .Claims .Where (c => c.Type == ClaimTypes.Role && c.Value.StartsWith ("Club") && c.Value.EndsWith (" Admin ")) .Выберите (c => c.Стоимость); – lyz

ответ

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

Возможно, вы можете использовать параметры IgnoreCase для StringComparison в проверке равенства, если хотите.

+0

Спасибо @Scottley, но это только вернет те же клуб. Мне нужен весь клуб Id –

+0

, а затем просто измените функцию roleFilter.Equals, чтобы быть любой другой логической операцией, в которой вы нуждаетесь. – Scottley

0

Ну, вы можете использовать Claims, конечно, но есть некоторые другие вещи (и проще), чтобы получить текущие роли пользователей.

Первый должен использовать класс UserManager<TUser>, который является экземпляром интерфейса IUserManager<TUser>. Когда вы создаете проект по умолчанию, он хранится как свойство в ваших контроллерах. В этом классе много полезных методов для работы с самими учетными записями пользователей (создание, редактирование, удаление) и с ролью пользователя (назначить, переназначить и получить их). Кроме того, с помощью этого менеджера вы можете быть 1000% уверены, что если кто-то изменили роли пользователя 1 секунду назад вы получите соответствующие роли пользователей всегда

Второй заключается в использовании встроенного IsInRole(string role) метода собственности User контроллеров. Он возвращает true, если в настоящее время зарегистрированный пользователь указал роль или false, если нет. Этот подход немного «неустойчив», поскольку он использует данные User, который является экземпляром IPrincipal и назначается, когда ваш пользователь входит в систему. Изменение текущих пользовательских ролей, если он в настоящее время вошел в систему, может иметь место только после того, как вы дадите этот пользователь с выходом из системы, а затем снова войдите в него. Это связано с тем, что вам нужно переназначить экземпляр экземпляра IdentityUser на текущий IPrincipal. Более того, это справедливо и для Claims массива ClaimsIdentity. Но если вы уверены, что это невозможно в вашей системе, вы можете забыть об этом.

Кроме того, если вы ваши роли определены в ролях перечисления его лучше, чтобы создать свой собственный метод расширения для User, который будет принимать ваши роли значения перечисления вместо вызова ToString() при каждом вызове, построенных в IsInRole():

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)) 
Смежные вопросы