Как проверить, находится ли пользователь в одной роли? Использование удостоверений в .NET Core 3.1

Как проверить, находится ли текущий пользователь в одной роли?

В моем приложении у меня может быть пользователь с несколькими ролями, но некоторые роли, такие как Role1, имеют определенное поведение. Как изолировать конкретное поведение от Role1, когда у пользователя есть две роли (Role1 и Role2)? Если пользователь находится в Role2, то у него должно быть другое поведение, даже если он тоже находится в Role1.

Решение, которое я придумал, было

if (User.IsInRole(Role1.ToString()) && !User.IsInRole(Role2.ToString()))
{
   //implementation
}

Есть ли другой способ сделать это? Может быть, с помощью политик?

ИМХО, вы должны кодировать права (или) разрешения (или) «претензии». Это недальновидно и сложно поддерживать код, написанный для ролей. Рассмотрим: granadacoder.wordpress.com/2010/12/01/…

granadaCoder 09.12.2020 17:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
2 048
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, что политика это лучший подход к вашему случаю. Создайте политику, которая использует RequireAssertion в построителе

См. этот пост: Авторизация на основе ролей в ASP.NET Core 3.1 с Identity и ExternalLogin

Есть ссылка или дополнительная информация о том, как это сделать?

Vinicius Bassi 09.12.2020 17:08

Как проверить, находится ли текущий пользователь в одной роли?

После успешного входа пользователя вы можете использовать метод UserManager.GetRoleAsync(), чтобы получить список имен ролей, к которым принадлежит указанный пользователь. Затем на основе результата проверить, находится ли пользователь в одной роли.

            var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
            if (result.Succeeded)
            {
                var user = _userManager.FindByEmailAsync(Input.Email).Result;
                var roles = _userManager.GetRolesAsync(user).Result.ToArray();
                // then, based on the roles array to check if the current user is in a single role.

                _logger.LogInformation("User logged in.");
                return LocalRedirect(returnUrl);
            }

Скриншот, как показано ниже:

Как изолировать конкретное поведение от роли 1, когда у пользователя есть два роли (роль1 и роль2)? Если пользователь находится в роли 2, он должен иметь другое поведение, даже если они также находятся в роли1. Есть ли другой способ сделать это? Может быть, с помощью политик?

Да, авторизация на основе политик — хороший выбор. Например, в моем примере есть 3 вида ролей: администратор, менеджер и пользователь.

Мы могли бы создать следующие политики в файле Startup.cs:

        services.AddAuthorization(options => {
            options.AddPolicy("readpolicy",
                builder => builder.RequireRole("Admin", "Manager", "User"));
            options.AddPolicy("writepolicy",
                builder => builder.RequireRole("Admin", "Manager"));
        });

Затем мы применим эти политики к контроллеру ролей, как показано ниже:

    [Authorize(Policy = "readpolicy")]
    public IActionResult Index()
    {
        var roles = roleManager.Roles.ToList();
        return View(roles);
    }
    [Authorize(Policy = "writepolicy")]
    public IActionResult Create()
    {
        return View(new IdentityRole());
    }

Теперь мы можем на основе политики вызывать метод действия.

Ссылка:

Добавление авторизации роли в основное приложение ASP.NET MVC

Авторизация на основе политик в ASP.NET Core

Это не решило мою проблему, но помогло мне, когда я кодировал решение.

Vinicius Bassi 27.03.2021 01:39
Ответ принят как подходящий

Решением для меня было создание метода, который проверяет, был ли пользователь в какой-либо из ролей:

    public async Task<bool> IsInAnyRoleAsync(TUser user, RoleEnum[] roles)
    {
        var userIsInRole = new List<bool>();
        foreach (var role in roles)
        {
            var roleName = Enum.GetName(role.GetType(), role);
            userIsInRole.Add(await IsInRoleAsync(user, roleName));
        }

        return userIsInRole.Any(isInRole => isInRole == true);
    }

Использование:

await _userManager.IsInAnyRoleAsync(user, [Role1, Role2]);

Другие вопросы по теме