在ASP.NET Core MVC中使用声明或仅角色

问题描述

在我的ASP.NET Core MVC项目中,我有这种情况:管理员可以在Web应用程序中执行任何操作,可以将其称为超级管理员,并且只有一个用户。该“超级”管理员可以添加其他受限制更大的管理员,例如,这些管理员无法创建类型管理员用户,或者看不到某些信息。

从技术上讲,它们有很多共同点。我已经有很多角色类型,所以我不想创建另一个称为超级管理员的角色,在这里我将只创建一个用户。因此,在这种情况下,我应该使用索赔吗?还是只创建两个角色更好?我知道它不会那么复杂,但是我想知道最佳实践。

我是ASP.NET Core的新手,所以我感谢可以帮助我的示例或文章,谢谢!

解决方法

我认为,通过声明或角色声明添加超级管理员之间没有什么区别,角色声明也是声明的一种。

我认为,如果您没有特殊要求,需要按声明添加用户超级管理员,最好的方法是使用声明。由于您可以直接使用[Authorize(Roles = "Superadmin")],而无需使用身份工厂来编写其他代码来添加声明。

如果要按声明添加超级管理员,则应使用answer这样的UserClaimsPrincipalFactory并按article所示添加声明策略。

,

我建议如果您需要创建许多角色,请使用 Claims-based authorization

您可以使用Authorize[Roles = "Admin"]属性,也可以创建自定义AuthorizeAttribute,例如:

  public class AuthorizeAccess : AuthorizeAttribute,IAuthorizationFilter
    {
        public string UniqueCode { get; set; }

        public void OnAuthorization(AuthorizationFilterContext context)
        {
            if (!context.HttpContext.User.HasClaim(c => c.Type == "CustomAccess" && c.Value.Equals(UniqueCode)))
            {
                // Redirect AccessDenied when the claim not exist.
                context.Result = new RedirectToPageResult("/AccessDenied");
                return;
            }
        }
    }

我们可以使用它

[AuthorizeAccess(UniqueCode = "EDIT")]
public class IndexModel : PageModel
{
         ....
}

在这种情况下,您需要在登录访问权限中加载声明列表

identity.AddClaim(new Claim("CustomAccess","HOME_PAGE"));
identity.AddClaim(new Claim("CustomAccess","EDIT"));
identity.AddClaim(new Claim("CustomAccess","DELETE"));
identity.AddClaim(new Claim("CustomAccess","INSERT"));