Реализация пользовательских пользовательских ролей ASP.NET Core - PullRequest
0 голосов
/ 14 сентября 2018

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


User Table structure

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


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

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

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

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

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

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

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

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

Я также добавлю метод Login и строки 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";
        });

Надеюсь, это пригодится любому нуждающемуся.

0 голосов
/ 15 сентября 2018

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

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

  • Выберите схему аутентификации для входа в систему пользователя (например, на основе файлов 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());
    

Теперь вы готовы к действию. Допустим, у вас есть метод Action, в котором вы хотите аутентифицировать пользователя. Здесь вы хотите изменить свою роль, чтобы ее можно было узнать по [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() { ... }

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

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

...