ASP.NET Core自定义定义的用户角色实现

时间:2018-09-14 13:26:26

标签: asp.net-core-mvc roles asp.net-authorization

我正在尝试定义 User Roles 的自定义方式,因为我的User表的数据库结构如下:


User Table structure

角色 是布尔值,因此,如果确实是该用户是管理员,则他是普通用户。


我知道我需要在 Startup.cs中声明add.UseAuthorization()并且可以在 Controller中添加属性[Roles="Administrator"] / [Roles="User"] ,但我不确定如何定义要由“用户”表中的角色列确定的角色。

我一直在搜索互联网,也在阅读有关政策的信息,但我认为这不是正确的实施方式。我在网上找到的所有内容都是关于身份结构的,但是对于如何将其附加到我的角色列上却没有任何意义。

希望,有人可以帮助我。谢谢!

1 个答案:

答案 0 :(得分:0)

另一种基于我的数据库而无需进行任何修改的实现方式是使用Claims和Cookies。我已经设法阅读以下文档

Link One

Link Two

我仅遇到一个主要问题,通过阅读this解决了该问题。

我还将添加Login方法和 Startup.cs 行,以便其他人可以看到如何使用它(如果文档不够用的话)。

登录方法,该方法来自 Controller

   [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";
        });

希望这对有需要的人有用。