2014-02-10 8 views
36

Я создал меню, основанное на ролях, для которого я выполнил this учебник. Где-вниз этой странице вы увидите следующую строку кода:идентификатор asp.net получить все роли вошедшего в систему пользователя

String[] roles = Roles.GetRolesForUser(); 

Он возвращает все роли, вошедшего в систему пользователя. Мне было интересно, как это сделать с новой системой ASP.NET Identity?

Это все еще довольно новый, и об этом мало что можно найти.

ответ

71

Controller.User.Identity является ClaimsIdentity. Вы можете получить список ролей, путем проверки претензий ...

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

--- обновление ---

разбив его немного больше ...

using System.Security.Claims; 

// ........ 

var userIdentity = (ClaimsIdentity)User.Identity; 
var claims = userIdentity.Claims; 
var roleClaimType = userIdentity.RoleClaimType; 
var roles = claims.Where(c => c.Type == ClaimTypes.Role).ToList(); 

// or... 
var roles = claims.Where(c => c.Type == roleClaimType).ToList(); 
+0

Согласно этому док http://msdn.microsoft.com/en-us/library/system.identitymodel.claims.claimtypes%28v=vs.110%29.aspx, нет 'Role' в 'ClaimTypes'. Нужно ли добавлять его или что-то еще? – Quoter

+0

Идентификатор ASP.NET использует 'System.Security.Claims.ClaimTypes' http://msdn.microsoft.com/en-us/library/system.security.claims.claimtypes(v=vs.110).aspx. Кроме того, объект 'ClaimsIdentity' также имеет свойство RoleClaimType, которое содержит одно и то же значение, и вы можете использовать его. –

+0

Не могли бы вы обновить свой ответ, чтобы показать мне, как это будет выглядеть в коде? Пробовал несколько способов, но я не вижу 'RoleClaimType'. – Quoter

8

Ниже приведен метод расширения вышеупомянутого решения.

public static List<string> Roles(this ClaimsIdentity identity) 
    { 
     return identity.Claims 
         .Where(c => c.Type == ClaimTypes.Role) 
         .Select(c => c.Value) 
         .ToList(); 
    } 
Смежные вопросы