【问题标题】:C# ASP.NET Identity 2 (.NET Framework MVC) - Using permission AND rolesC# ASP.NET Identity 2 (.NET Framework MVC) - 使用权限和角色
【发布时间】:2018-03-29 14:34:15
【问题描述】:

我正在尝试制作权限/角色授权应用。我的想法是混合角色和权限,以便管理员可以创建具有不同权限的不同角色来执行某些操作。

例子,

我想在我的控制器中加入这样的东西:

namespace MyApp.Controllers
{
    public class SettingsController : Controller
    {
        // All the ASP.NET Identity UserManager, SignInManager
        and RoleManager configuration

       [HasPermission(Permission = "SensitiveData")]
       // GET: /Settings/SensitiveData
       public ActionResult SensitiveData()
       {
           // Collect some information to display
           return View()
       }

       [HasPermission(Permission = "ListUsers")]
       // GET: /Settings/ListUsers
       public ActionResult ListUsers()
       {
           // Collect some information to display
           return View()
       }
    }
}

我的想法是在最初的五个表中创建两个额外的表,这些表“带有” ASP.NET Identity,一个称为 AspNetPermissions,另一个称为 AspNetRolePermissions

AspNetPermissions 将具有 Id 和 Permission 字段。 AspNetRolePermissions 将具有 RoleId 和 PermissionId。

管理员用户可以创建、编辑或删除角色。这些角色将成为对权限进行分组的友好方式。因此,例如,我希望允许维护角色下的所有用户使用我以前的控制器的“SensitiveData”和“ListUsers”操作,而营销角色下的用户只允许使用“ListUsers”操作。我将从管理员帐户创建角色“维护”,将设置权限添加到“敏感数据”和“列表用户”。然后我会按照相同的概念来创建“营销”角色,所以 de DB 看起来像:

-------------------------------
       AspNetPermissions*
-------------------------------
Id             | Permission
---------------|---------------
permissionId1  | SensitiveData
permissionId2  | ListUsers
...            | ...

*这个是预装的,连管理员都不能创建权限

-------------------------------
       AspNetRolePermissions
-------------------------------
RoleId         | PermissionId
---------------|---------------
maintenanceId  | permissionId1
maintenanceId  | permissionId2
marketingId    | permissionId2

最后,我会将角色添加到一些用户(我可以使用的那部分)。

我无法做到的是:

  1. 创建 AspNetPermissions 和 AspNetRolePermissions
  2. 创建 AspNetRolePermissions 与 AspNetPermissions 和 AspNetRoles 之间的关系
  3. 创建过滤器 HasPermission(Permission = "somepermission")
  4. 检查尝试访问的用户是否具有与 AspNetRolePermissions 中所需权限配对的角色

我需要一些帮助,我已经阅读了一整天,但找不到任何有用的东西,只是一些我无法满足我需要的东西。

我认为从这一点来看是最好的方法,因为管理员用户可以创建一个角色,设置该角色的权限,然后将该角色添加到他或她想要的多少用户。如果我将权限直接设置给用户,那么当我拥有的用户不止几个时,以后就很难更改权限。


编辑


我已经做到了:

在 IdentityModel.cs 上,我添加了 ApplicationRole 和 UserPermission 并以这种方式编辑了 ApplicationDbContext:

public class ApplicationRole : IdentityRole
{
    public ApplicationRole()
    {
    }

    public ApplicationRole(string name)
        : base(name)
    {
    }

    //

    public virtual ICollection<UserPermission> Permissions { get; private set; }
}

public class UserPermission
{
    public string Id { get; set; } = Guid.NewGuid().ToString();
    public string Permission { get; set; }
    public virtual ICollection<ApplicationRole> Roles { get; private set; }

}

public class UserRolePermissions
{
    public string RoleId { get; set; }
    public string PermissionId { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    const string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;Database=LocalTestingDB;trusted_connection=yes;";
    public ApplicationDbContext()
        :base(connectionString, throwIfV1Schema: false)
    {
    }

    public DbSet<UserPermission> Permissions;

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<UserPermission>()
            .ToTable("AspNetPermissions")
            .HasKey(x => x.Id);

        modelBuilder.Entity<ApplicationRole>()
            .HasMany<UserPermission>(ar => ar.Permissions)
            .WithMany(up => up.Roles)
            .Map(arup =>
                {
                    arup.MapLeftKey("RoleId");
                    arup.MapRightKey("PermissionId");
                    arup.ToTable("AspNetRolePermissions");
                });
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

这为多对多关系创建了 AspNetPermissions 表和 AspNetRolePermissions 表,并为我提供了对 Roles 表的更多自定义能力(我认为没有太多使用它,但很高兴知道我拥有它)。

在 FilterConfig.cs 中,在我添加的 FilterConfig 类下:

public class HasPermissionAttribute : ActionFilterAttribute
{
    private string _permission;

    public HasPermissionAttribute(string permission)
    {
        Permission = permission;
    }

    public string Permission
    {
        get
        {
            return _permission;
        }
        private set
        {
            _permission = value;
        }
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!CheckIfRoleHasPermission(Permission))
        {                
            var url = new UrlHelper(filterContext.RequestContext);
            var loginUrl = url.Content("/Cuenta/Ingresar");
            filterContext.HttpContext.Response.Redirect(loginUrl, true);
        }
        //base.OnActionExecuting(filterContext);
    }

    public bool CheckIfRoleHasPermission(string perm)
    {
        return false;
    }
}

我需要创建一个名为 CheckIfRoleHasPermission 的方法,它可以获取当前用户角色并检查是否有任何与该角色相关的权限。关于如何做到这一点的任何想法?或者对我已经完成的事情进行任何更正?

【问题讨论】:

  • 问题是什么?
  • “我无法实现的是:”部分,这 4 个项目
  • 目前尚不清楚您究竟需要什么帮助,而且不太可能有人能够帮助您。告诉我们您为实现您想要的目标所做的努力以及您遇到的错误。请阅读https://stackoverflow.com/help/mcve
  • 对不起,我已经把它弄红了,我认为我说得非常清楚。我没有尝试过的东西,因为我已经丢失了更改(无论如何我尝试过的东西都无处可去),并且我准确地解释了我正在尝试做的事情并需要帮助。根据我建议的模式。我今天会尝试阅读并再次执行此操作,但我不知道如何更清楚
  • 这不是一个不合理的设计,但我认为您的问题范围有点大。我建议将您的问题分解为多个问题并尝试找到这些答案。

标签: asp.net-mvc permissions asp.net-identity .net-framework-version asp.net-roles


【解决方案1】:

我做到了,如果有人遇到同样的情况,我只是将我的代码上传到 GitHub。这是链接:REPO-NO-LONGER-AVAILABLE。有些部分是西班牙语,但我会尝试制作一个指南,解释我的代码的核心部分在哪里,以便可以将其添加到任何项目中,稍后我还将尝试将所有内容分成不同的项目,然后上传NuGet 的代码。欢迎任何想要增加功能或与 repo 合作的人!

编辑

该项目现在更加先进,我制作了一个指南来解释它的作用。欢迎任何评论(我会接受负面评论来改进它)

编辑 2

现在已经过时了。

【讨论】:

  • 它不再可用,因为我所做的一切都通过身份核心进行了改进。我试图删除这个问题,因为它已经完全过时了,但我做不到。我会编辑,所以很清楚
猜你喜欢
  • 2013-12-26
  • 2017-06-25
  • 1970-01-01
  • 2010-12-23
  • 2016-10-24
  • 1970-01-01
  • 2017-02-06
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多