Реализация настраиваемых пользовательских ролей в ASP.NET Core

Я пытаюсь определить собственный способ Роли пользователей, поскольку моя структура БД для таблицы User имеет следующую структуру:


Реализация настраиваемых пользовательских ролей в ASP.NET Core

Роль - это логическое значение, поэтому, если это правда, пользователь является администратором, иначе он обычный пользователь.


Я знаю, что мне нужно объявить add.UseAuthorization() в Startup.cs., и я могу добавить атрибут [Roles = "Administrator"] / [Roles = "User"] внутри Контроллер, но я не уверен, как определить роль, которая будет определяться моим столбцом Роль из таблицы User.

Я искал в Интернете, читал о Политики, но я не думаю, что это правильный способ реализации. Все, что я нашел в Интернете, касается какой-то структуры Личность, но не имеет никакого смысла в том, как прикрепить ее к моему столбцу Роль.

Надеюсь, кто-нибудь может мне помочь. Спасибо!

Это действительно не способ реализовать безопасность. Пожалуйста, прочтите документацию: docs.microsoft.com/nl-nl/aspnet/core/security/…

Ruard van Elburg 16.09.2018 14:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
1 352
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы можете свободно манипулировать своей БД, я настоятельно рекомендую использовать Идентичность, это мощный фреймворк, который можно интегрировать в вашу собственную базу данных.

Но чтобы конкретно ответить на ваш вопрос, не хватает двух шагов:

  • Выберите схему аутентификации для входа пользователя (например, на основе файлов cookie, ...)
  • После входа пользователя в систему сохраните созданный Роль в объекте ClaimsPrincipal. Таким образом, декларация [Authorize(Roles = "User")] сможет это уловить.

Ниже вы найдете базовый пример использования шаблона ASP.NET Core по умолчанию в Visual Studio.

  1. Добавьте промежуточное ПО аутентификации к вашему методу ConfigureServices и настройте его с помощью AuthenticationScheme. В этом случае я использую аутентификацию с помощью файлов cookie.

    //in ConfigureServices, add both middlewares
    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie();
    
    //in the Configure() method, enable these middlewares
    app.UseAuthentication();
    app.UseCookiePolicy(new CookiePolicyOptions());
    

Теперь вы готовы к действию. Допустим, у вас есть метод действия, в котором вы хотите аутентифицировать пользователя. Здесь вы хотите преобразовать свою роль, чтобы ее мог распознать [Authorize].

  1. Получите нужную ценность из своей базы данных. В итоге вы получите bool. Преобразуйте ее в роль Claim и добавьте ее в ClaimsIdentity.

    bool roleFromDb = true;  //this comes from db
    
    //convert to Claim of "Role" type, and create a ClaimsIdentity with it
    var adminClaim = new Claim(ClaimTypes.Role, roleFromDb ? "Administrator" : "User"); 
    var claimIdentity = new ClaimsIdentity(new[] { adminClaim }, 
                        CookieAuthenticationDefaults.AuthenticationScheme);
    
    //signs in the user and add the ClaimsIdentity which states that user is Admin
    await HttpContext.SignInAsync(
            CookieAuthenticationDefaults.AuthenticationScheme,
            new ClaimsPrincipal(claimIdentity));
    

После этого вы можете пометить другие методы действий с помощью атрибута [Authorize], например:

[Authorize(Roles = "User")]
public IActionResult About() { ... }

[Authorize(Roles = "Administrator")]
public IActionResult Contact() { ... }

Теперь только зарегистрированный пользователь с ролью «Администратор» может посещать страницу контактов.

Проверьте ресурс это для более точной конфигурации используемого промежуточного программного обеспечения.

Да, именно этот ответ я искал, потому что немного запутался в том, что читал ранее. Я также поговорил сегодня со своим наставником, и он рассказал мне о том же, что и в отношении Cookie-файлов и претензий. Спасибо!

Vlădel 19.09.2018 08:17
Ответ принят как подходящий

Другой способ реализации, основанный на моей базе данных без каких-либо изменений, - это использование заявлений и файлов cookie. Мне удалось это сделать, прочитав следующие документы

Ссылка первая

Ссылка вторая

Я столкнулся только с одной серьезной проблемой, которая была решена путем чтения это.

Я также добавлю метод входа в систему и строки Startup.cs, чтобы другие могли видеть, как его использовать (если документов недостаточно).

Авторизоваться метод из Контроллер

   [AllowAnonymous]
    [HttpPost]
    public async Task<IActionResult> Login(UserModel userModel)
    {
        if (_iUserBus.LoginUser(userModel))
        {
            var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.Name, userModel.Email),
                    new Claim(ClaimTypes.Role, _iUserBus.GetRole(userModel.Email)),
                };

            ClaimsIdentity userIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
            ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);

            var authProperties = new AuthenticationProperties
            {
                IsPersistent = false,
            };

            await HttpContext.SignInAsync(principal, authProperties);

            return RedirectToAction("Index", "Home");
        }
        else
        {
            ModelState.AddModelError("Password", "Email and/or Password wrong");

            return View();
        }
    }

Startup.cs

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        });

        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>
        {
            options.LoginPath = "/Users/Login";
            options.LogoutPath = "/Users/Logout";
        });

Надеюсь, это будет полезно всем, кто в этом нуждается.

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