Невозможно получить роли из GenericIdentity

Я настраиваю GenericPrincipal добавив GenericIdentity и ролей, но когда я пытаюсь извлечь из него роли, я ничего не получаю. Однако, если я позвоню Principal.IsInRole, он возвращает правильное значение.

Что мне не хватает?

Пример: https://dotnetfiddle.net/Uan3ru

var identity = new GenericIdentity("Test", "Test");
var pricipal = new GenericPrincipal(identity, new[] { "Role1", "Role2" });
var cls = identity.Claims
                  .Where(c => c.Type == ClaimTypes.Role)
                  .Select(c => c.Value);
foreach(var c in cls)
{
    Console.WriteLine(c);
}
Console.WriteLine("complete");

1 ответ

В своем коде вы добавляете роли к объекту GenericPrincipal, а не к объекту GenericIdentity.

Таким образом, объект идентификации не имеет никаких заявлений о роли, связанных с ним, в то время как основной объект имеет.


Получение ролей от GenericPrincipal

Вы должны быть в состоянии получить роли от GenericPrincipal объект вроде так:

var identity = new GenericIdentity("Test", "Test");
var principal = new GenericPrincipal(identity, new[] { "Role1", "Role2" });

// We need to get the claims associated with the Principal instead of the Identity
var roles = principal.Claims
                     .Where(c => c.Type == ClaimTypes.Role)
                     .Select(c => c.Value);

Console.WriteLine("Roles associated with the GenericPrincipal:");
foreach(var role in roles)
{
    Console.WriteLine(role);
}

Пример: https://dotnetfiddle.net/wCxmIR


Получение ролей от GenericIdentity

Если вам нужно отслеживать роли для конкретного GenericIdentity объект, вам придется явно добавить утверждения роли к экземпляру. Затем вы можете получить роли из объекта удостоверения следующим образом:

var roles = new[] { "Role1", "Role2" };
var identity = new GenericIdentity("Test", "Test");

// Explicitly add role Claims to the GenericIdentity
foreach (var role in roles)
{
    identity.AddClaim(new Claim(ClaimTypes.Role, role));
}

Console.WriteLine(String.Empty);
Console.WriteLine("All Claims associated with the GenericIdentity:");
foreach (var claim in identity.Claims)
{
    Console.WriteLine(claim);
}
Другие вопросы по тегам