Правильный способ оценки роли в авторизации как User.IsInRole () всегда возвращает false - PullRequest
0 голосов
/ 27 октября 2018

Много было задано вокруг User.IsInRole, но я не могу найти правильный ответ.

Мне нужно подтвердить определенную роль, используя AuthorizationHandler (через требование авторизации)

У меня есть проект ASP.NET Core 2.1 с индивидуальными учетными записями пользователей. Я заполнил базу данных и добавил пользователя к роли (одна роль), используя userManager.AddToRoleAsync, и да, база данных показывает пользователей, роли и связь между ними.

Я создал CandidateViewHandler, который управляет авторизацией для View-Contorller. ЭТО выглядит следующим образом

public class CandidateViewHandler : AuthorizationHandler<ViewCandidateRequirement, Candidate>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ViewCandidateRequirement requirement, Candidate resource)
    {
        if (context.User.Identity.IsAuthenticated)
        {
            if (resource.Email == context.User.FindFirst(ClaimTypes.Name).Value)
            {
                context.Succeed(requirement);
            }
            else
            {
                bool IsAdmin = context.User.IsInRole("Administrator");
                bool IsSearch = context.User.IsInRole("Searcher");                    
                if (IsAdmin == true || IsSearch == true)
                {
                    context.Succeed(requirement);
                }
            }
        }
        return Task.CompletedTask;
    }
}

Однако IsAdmin и IsSearch всегда возвращают false. Даже при тестировании в контроллере результаты остаются прежними. Должен ли я использовать Claims в 2.1? И если да, то как?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

То, что обсуждение, упомянутое Чарльзом де М., ИМО фактически показывает, - то, что роли - фактически ненужное дополнение к идентичности.Сдается мне, что в будущем было бы лучше удалить таблицу AspNetRoles (или, по крайней мере, больше не использовать ее) и использовать роли в качестве утверждений напрямую, а не иметь идентичность для добавления ролей в качестве утверждений.

Добавьте свои утверждения типа роли в таблицу AspNetUserClaims .Тип заявки по умолчанию равен http://schemas.microsoft.com/ws/2008/06/identity/claims/role.Любая заявка этого типа должна автоматически отображаться как роль, чтобы ее можно было использовать с IsInRole .

Вы также можете использовать настраиваемое сопоставление в клиенте:

services.AddAuthentication()
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
            {
                RoleClaimType = "role",
                NameClaimType = "name",
            };
    });

Дополнительное замечание: вы можете больше не использовать роли, поскольку ядро ​​asp.net имеет много более продвинутых функций, которые вы можете использовать для авторизации.

0 голосов
/ 27 октября 2018

Очевидно, что ASP.NET CORE 2.1 имеет проблемы с ролями: https://github.com/aspnet/Identity/issues/1813,, как объяснено в этой теме.Тем не менее, все еще остается вопрос о том, как заменить роли утверждениями.

Обходной путь заключается в том, чтобы вернуться к более старой конфигурации в файле startup:

services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultUI()
        .AddDefaultTokenProviders()

(удалите AddDefaultIdentity<ApplicationUser>.AddRole<ApplicationRole>и замените на AddIdentity<AppplicationRole, ApplicationUser>. Теперь все работает нормально.

...