博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET Identity “角色-权限”管理 4
阅读量:4643 次
发布时间:2019-06-09

本文共 2620 字,大约阅读时间需要 8 分钟。

1.1.       User-Role分析

想必大家已经注意到了Microsoft.AspNet.Identity.EntityFramework是对Microsoft.AspNet.Identity.Core的EF实现,微软是如何处理IdentityUser与IdentityRole的关系?因两者为多对多关系,会在关系型数据库增加一张关联表,故增加IdentityUserRole,并在IdentityUser与IdentityRole中添加IdentityUserRole列表,代码如下所示。

public class IdentityUserRole<TKey>

{

    public virtual TKey RoleId { get; set; }

       

    public virtual TKey UserId { get; set; }

}

IdentityUser

public class IdentityUser<TKey, TLogin, TRole, TClaim> : IUser<TKey> where TLogin: IdentityUserLogin<TKey> where TRole: IdentityUserRole<TKey> where TClaim: IdentityUserClaim<TKey>

{

    public IdentityUser()

    {

        this.Roles = new List<TRole>();

    }

    public ICollection<TRole> Roles { virtual get; private set; }

    其它代码省略….

}

IdentityRole

public class IdentityRole<TKey, TUserRole> : IRole<TKey> where TUserRole: IdentityUserRole<TKey>

{

    public IdentityRole()

    {

        this.Users = new List<TUserRole>();

    }

       

    public TKey Id { get; set; }

       

    public string Name { get; set; }

       

    public ICollection<TUserRole> Users { virtual get; private set; }

}

EF分别配置IdentityUser、IdentityRole与IdentityUserRole的1对多关系。

public class IdentityDbContext: DbContext

{

    public IdentityDbContext() : this("DefaultConnection")

    {

    }

       

    protected override void OnModelCreating(DbModelBuilder modelBuilder)

    {

        if (modelBuilder == null)

        {

            throw new ArgumentNullException("modelBuilder");

        }

        EntityTypeConfiguration<TUser> configuration = modelBuilder.Entity<TUser>().ToTable("AspNetUsers");

        configuration.HasMany<TUserRole>(u => u.Roles).WithRequired().HasForeignKey<TKey>(ur => ur.UserId);

        IndexAttribute indexAttribute = new IndexAttribute("UserNameIndex") {

            IsUnique = true

        };

        configuration.Property((Expression<Func<TUser, string>>) (u => u.UserName)).IsRequired().HasMaxLength(0x100).HasColumnAnnotation("Index", new IndexAnnotation(indexAttribute));

        configuration.Property((Expression<Func<TUser, string>>) (u => u.Email)).HasMaxLength(0x100);

        modelBuilder.Entity<TUserRole>().HasKey(r => new { UserId = r.UserId, RoleId = r.RoleId }).ToTable("AspNetUserRoles");

        EntityTypeConfiguration<TRole> configuration2 = modelBuilder.Entity<TRole>().ToTable("AspNetRoles");

        IndexAttribute attribute2 = new IndexAttribute("RoleNameIndex") {

            IsUnique = true

        };

        configuration2.Property((Expression<Func<TRole, string>>) (r => r.Name)).IsRequired().HasMaxLength(0x100).HasColumnAnnotation("Index", new IndexAnnotation(attribute2));

        configuration2.HasMany<TUserRole>(r => r.Users).WithRequired().HasForeignKey<TKey>(ur => ur.RoleId);

    }

       

    public virtual IDbSet<TRole> Roles { get; set; }

       

    public virtual IDbSet<TUser> Users { get; set; }

}

模仿上述设计,实现Role-Permission关系。

转载于:https://www.cnblogs.com/mlemon/p/4304586.html

你可能感兴趣的文章
[转]phpredis中文手册
查看>>
queryList4 的 curl实现位置 cookie位置
查看>>
有哪些好用的在线工具 小工具 截图/二维码生成/时间戳/图片拼接合成/ 等等 ---持续更新...
查看>>
IBaits联合查询
查看>>
Sql行列转换
查看>>
导出word之插入图片
查看>>
Servlet处理请求的流程(包括二次请求)
查看>>
eclipse设置maven加载国内镜像
查看>>
Vue 表单控件绑定
查看>>
帮助你操作数字和处理数字格式的javascript类库 - Numeral.js
查看>>
Error parsing XML: junk after document element
查看>>
Docker:集装箱式“运输”在软件上的实现
查看>>
[SQL Server] 数据库日志文件自动增长导致连接超时的分析
查看>>
lightoj1050_概率dp
查看>>
第七章 软件测试
查看>>
待补 http://acm.hdu.edu.cn/showproblem.php?pid=6583
查看>>
linux下搭建svn代码库
查看>>
ZeroMQ接口函数之 :zmq_msg_get - 获取消息的性质
查看>>
React 省市区三级联动
查看>>
再聊 cocos2dx -quick 适配
查看>>