【问题标题】:Claim Management best practise for user edit page用户编辑页面的索赔管理最佳实践
【发布时间】:2021-08-03 18:59:07
【问题描述】:

我已经设法让索赔工作并且效果很好,但我想扩展 cliams 表以具有控制器和区域,我还想在带有复选框的编辑页面中显示角色。

目前我的索赔权限如下。

我不能通过这种方式获得每个角色的所有权限

public async Task<ActionResult> Index(string roleId)
{
  var model = new PermissionViewModel();
  var allPermissions = new List<RoleClaimsViewModel>();
      allPermissions.GetPermissions(typeof(Permissions.Products), roleId);
      var role = await _roleManager.FindByIdAsync(roleId);
      model.RoleId = roleId;
      var claims = await _roleManager.GetClaimsAsync(role);
      var allClaimValues = allPermissions.Select(a => a.Value).ToList();
      var roleClaimValues = claims.Select(a => a.Value).ToList();
      var authorizedClaims = allClaimValues.Intersect(roleClaimValues).ToList();
      foreach (var permission in allPermissions)
      {
            if (authorizedClaims.Any(a => a == permission.Value))
            {
                permission.Selected = true;
            }
        }
        model.RoleClaims = allPermissions;
        return View(model);
      }

所以我的两个问题是如何扩展角色声明表,以及如何提供用户可以更改声明的编辑页面。他们是否有任何关于声明编辑页面的最佳实践。

【问题讨论】:

    标签: c# asp.net-core asp.net-identity


    【解决方案1】:

    如何扩展角色声明表以及如何提供一个 用户可以更改声明的编辑页面。

    要扩展角色声明表,就像扩展AspNetUser 表一样。你应该继承自IdentityRoleClaim。

    这样的代码:

    public class ApplicationUser : IdentityUser
    {
        public virtual ICollection<ApplicationUserClaim> Claims { get; set; }
        public virtual ICollection<ApplicationUserLogin> Logins { get; set; }
        public virtual ICollection<ApplicationUserToken> Tokens { get; set; }
        public virtual ICollection<ApplicationUserRole> UserRoles { get; set; }
    }
    
    public class ApplicationRole : IdentityRole
    {
        public virtual ICollection<ApplicationUserRole> UserRoles { get; set; }
        public virtual ICollection<ApplicationRoleClaim> RoleClaims { get; set; }
    }
    
    public class ApplicationUserRole : IdentityUserRole<string>
    {
        public virtual ApplicationUser User { get; set; }
        public virtual ApplicationRole Role { get; set; }
    }
    
    public class ApplicationUserClaim : IdentityUserClaim<string>
    {
        public virtual ApplicationUser User { get; set; }
    }
    
    public class ApplicationUserLogin : IdentityUserLogin<string>
    {
        public virtual ApplicationUser User { get; set; }
    }
    
    public class ApplicationRoleClaim : IdentityRoleClaim<string>
    {
        public DateTime Created { get; set; }
        public virtual ApplicationRole Role { get; set; }
    }
    
    public class ApplicationUserToken : IdentityUserToken<string>
    {
        public virtual ApplicationUser User { get; set; }
    }
    

    数据库上下文:

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string, 
        ApplicationUserClaim, ApplicationUserRole, ApplicationUserLogin,
        ApplicationRoleClaim, ApplicationUserToken>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Entity<ApplicationUser>(b =>
            {
                // Each User can have many UserClaims
                b.HasMany(e => e.Claims)
                    .WithOne(e => e.User)
                    .HasForeignKey(uc => uc.UserId)
                    .IsRequired();
    
                // Each User can have many UserLogins
                b.HasMany(e => e.Logins)
                    .WithOne(e => e.User)
                    .HasForeignKey(ul => ul.UserId)
                    .IsRequired();
    
                // Each User can have many UserTokens
                b.HasMany(e => e.Tokens)
                    .WithOne(e => e.User)
                    .HasForeignKey(ut => ut.UserId)
                    .IsRequired();
    
                // Each User can have many entries in the UserRole join table
                b.HasMany(e => e.UserRoles)
                    .WithOne(e => e.User)
                    .HasForeignKey(ur => ur.UserId)
                    .IsRequired();
            });
    
            modelBuilder.Entity<ApplicationRole>(b =>
            {
                // Each Role can have many entries in the UserRole join table
                b.HasMany(e => e.UserRoles)
                    .WithOne(e => e.Role)
                    .HasForeignKey(ur => ur.RoleId)
                    .IsRequired();
    
                // Each Role can have many associated RoleClaims
                b.HasMany(e => e.RoleClaims)
                    .WithOne(e => e.Role)
                    .HasForeignKey(rc => rc.RoleId)
                    .IsRequired();
            });
        }
    }
    

    然后,您可以执行迁移命令来更新数据库。之后,您可以通过ApplicationDbContext 和ApplicationRole 和ApplicationRoleClaim 模型访问AspNetRole 和AspNetRoleClaim 表。更多详细信息,请参考Customize the model。

    【讨论】:

    • 感谢示例如何通过 AddClaimAysnc 方法访问这些自定义属性
    猜你喜欢
    • 2018-06-25
    • 2019-06-07
    • 2010-09-16
    • 2020-04-13
    • 2020-11-11
    • 2018-10-04
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    相关资源
    最近更新 更多