13

Я понимаю, что я могу использовать претензии делать заявление о пользователе:ASP.NET Идентичность «Ролевой» Претензии

var claims = new List<Claim>(); 
claims.Add(new Claim(ClaimTypes.Name, "Peter")); 
claims.Add(new Claim(ClaimTypes.Email, "[email protected]")); 

Но как я должен хранить «на основе ролей» претензии? Например:

Пользователь супер администратор.

claims.Add(new Claim("IsSuperAdmin, "true")); 

Параметр значение "истина" чувствует себя совершенно излишним. Как еще это выражение может быть выражено с использованием претензий?

ответ

20

Это уже сделано за вас рамками. Когда пользователь вошел в систему, все роли пользователя добавляются в качестве претензий с типом претензий: ClaimTypes.Role, а значения - это имя роли.

И когда вы выполняете IPrincipal.IsInRole("SuperAdmin"), структура фактически проверяет, существует ли у пользователя требование с типом ClaimTypes.Role и значением SuperAdmin.

Так что ничего особенного не нужно делать. Просто добавьте пользователя в роль.

+0

Какова связь между претензиями типа Role и таблицей AspNetRoles? – mayu

+0

@Tymski 'AspNetRoles' содержит список ролей. Когда пользователь входит в систему, все эти роли добавляются в файл cookie в качестве претензий типа 'ClaimTypes.Role'. Претензии в cookie недолговечны. Записи в базе данных просто копируются в файл cookie. – trailmax

+0

Я должен указать, что 'IPrincipal.IsInRole (« xx »)' не обязательно использует 'ClaimTypes.Role' при поиске подходящего требования. Например, «WindowsPrincipal», который вы можете получить после проверки подлинности Windows, фактически использует «ClaimTypes.GroupSid» для указания ролей. Вместо этого используйте свойство 'ClaimsIdentity.RoleClaimType'. – Rob

11

Вы можете хранить роли, используя ClaimType Role

claims.Add(new Claim(ClaimTypes.Role, "SuperAdmin")); 
+1

Я сделал комментарий выше, но он также применим и здесь: было бы более надежно использовать свойство 'ClaimsIdentity.RoleClaimType' при добавлении ролей. – Rob

+0

Как насчет более чем одной роли? –

+0

Запятая? Несколько претензий одного типа? Другие? –

1

Необходимо указать роль в претензии с типом ClaimsType.Role и указать тип претензии, который содержит роль в ClaimsIdentity, как показано ниже.

var claimsIdentity = new ClaimsIdentity(new[] 
{ 
    new Claim(ClaimTypes.Email, "[email protected]"), 
    new Claim(ClaimTypes.Name, "Peter"), 
    new Claim(ClaimTypes.Role, "SuperAdmin"), 
}, 
"ApplicationCookie", ClaimTypes.Email, ClaimTypes.Role); 

Это позволит затем использовать атрибут [Authorize(Roles = "SuperAdmin")] в контроллерах.

Смежные вопросы