Simplemembership实现用户权限管理-扩展数据库

MVC4 Simplemembership 扩展自己的数据库结构

第一步:用户信息表UserProfile

在实际使用起来,需要向UserProfile添加自己的字段,例如Email,PhoneNumber,Address等等。

实现起来非常简单只需在UserProfile中声明一下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.ComponentModel.DataAnnotations;
  7. using System.Data.Entity;
  8. using System.ComponentModel.DataAnnotations.Schema;
  9.  
  10. namespace TYStudio
  11. {
  12.     [Table("UserProfile")]
  13.     public class UserProfile
  14.     {
  15.         [Key]
  16.         [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
  17.         [Display(Name="ID")]
  18.         public int UserId { get; set; }
  19.  
  20.         [Display(Name = "用户名")]
  21.         [StringLength(250)]
  22.         public string UserName { get; set; }
  23.  
  24.         [Display(Name = "邮件地址")]
  25.         [StringLength(250)]
  26.         public string Email { get; set; }
  27.     }
  28. }

重新运行之后数据库字段就生成了。这样就可以根据自己的需要添加各种用户注册信息了。

第二步:角色表webpages_Roles

扩展webpages_Roles表,与TYStudioMembership,PermissionsInRoles关连,这两个表后面会有介绍。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.ComponentModel.DataAnnotations;
  7. using System.Data.Entity;
  8. using System.ComponentModel.DataAnnotations.Schema;
  9.  
  10. namespace TYStudio
  11. {
  12.     [Table("webpages_Roles")]
  13.     public class Role
  14.     {
  15.         public Role()
  16.         {
  17.             Members = new List<TYStudioMembership>();
  18.             PermissionsInRoles = new List<PermissionsInRoles>();
  19.         }
  20.  
  21.         [Key]
  22.         [Display(Name = "ID")]
  23.         public int RoleId { get; set; }
  24.  
  25.         [Display(Name = "名称")]
  26.         [StringLength(256)]
  27.         public string RoleName { get; set; }
  28.  
  29.         public ICollection<TYStudioMembership> Members { get; set; }
  30.  
  31.         [ForeignKey("RoleId")]
  32.         public ICollection<PermissionsInRoles> PermissionsInRoles { set; get; }
  33.     }
  34. }

第三步:webpages_Membership

添加webpages_Membership表,这个主要存储Membership的信息内容,以后要用到(比如重置密码)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.ComponentModel.DataAnnotations;
  7. using System.Data.Entity;
  8. using System.ComponentModel.DataAnnotations.Schema;
  9.  
  10. namespace TYStudio
  11. {
  12.     [Table("webpages_Membership")]
  13.     public class TYStudioMembership
  14.     {
  15.         public TYStudioMembership()
  16.         {
  17.             Roles = new List<Role>();
  18.         }
  19.  
  20.         [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
  21.         public int UserId { get; set; }
  22.         public DateTime? CreateDate { get; set; }
  23.         [StringLength(128)]
  24.         public string ConfirmationToken { get; set; }
  25.         public bool? IsConfirmed { get; set; }
  26.         public DateTime? LastPasswordFailureDate { get; set; }
  27.         public int PasswordFailuresSinceLastSuccess { get; set; }
  28.         [Required, StringLength(128)]
  29.         public string Password { get; set; }
  30.         public DateTime? PasswordChangedDate { get; set; }
  31.         [Required, StringLength(128)]
  32.         public string PasswordSalt { get; set; }
  33.         [StringLength(128)]
  34.         public string PasswordVerificationToken { get; set; }
  35.         public DateTime? PasswordVerificationTokenExpirationDate { get; set; }
  36.         [StringLength(128)]
  37.         public string PasswordResetToken { get; set; }
  38.  
  39.         public ICollection<Role> Roles { get; set; }
  40.     }
  41. }


第四步:权限表webpages_Permission

添加webpages_Permission表,用来存储具体的Action权限。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.ComponentModel.DataAnnotations;
  7. using System.Data.Entity;
  8. using System.ComponentModel.DataAnnotations.Schema;
  9.  
  10. namespace TYStudio
  11. {
  12.     [Table("webpages_Permission")]
  13.     public class Permission
  14.     {
  15.         public Permission()
  16.         {
  17.             PermissionsInRoles = new List<PermissionsInRoles>();
  18.         }
  19.  
  20.         [Key]
  21.         [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
  22.         [Display(Name="权限ID")]
  23.         public int PermissionId { get; set; }
  24.  
  25.         [Display(Name = "名称")]
  26.         public string PermissionName { get; set; }
  27.  
  28.         [ForeignKey("PermissionId")]
  29.         public ICollection<PermissionsInRoles> PermissionsInRoles { set; get; }
  30.     }
  31. }

第五步:关系表webpages_PermissionsInRoles

添加角色权限关系表webpages_PermissionsInRoles。用来存储角色的具体权限。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.ComponentModel.DataAnnotations;
  7. using System.Data.Entity;
  8. using System.ComponentModel.DataAnnotations.Schema;
  9.  
  10. namespace TYStudio
  11. {
  12.     [Table("webpages_PermissionsInRoles")]
  13.     public class PermissionsInRoles
  14.     {
  15.         [Key]
  16.         public int Id { get; set; }
  17.  
  18.         public int RoleId { get; set; }
  19.         public int PermissionId { get; set; }
  20.  
  21.         [Column("RoleId"), InverseProperty("PermissionsInRoles")]
  22.         public Role Role { get; set; }
  23.  
  24.         [Column("PermissionId"), InverseProperty("PermissionsInRoles")]
  25.         public Permission Permission { get; set; }
  26.     }
  27. }

第六步:修改UserContext

数据库的扩展类添加完毕之后,最后还需要修改UserContext,来添加新的实体类集合,并注册他们之间的关系。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.ComponentModel.DataAnnotations;
  7. using System.Data.Entity;
  8. using System.ComponentModel.DataAnnotations.Schema;
  9.  
  10. namespace TYStudio
  11. {
  12.     public class TYStudioMembershipContext : DbContext
  13.     {
  14.         public TYStudioMembershipContext()
  15.             : base("TYStudioUsersConnectionString")
  16.         {
  17.         }
  18.  
  19.         public DbSet<UserProfile> UserProfiles { get; set; }
  20.         public DbSet<TYStudioMembership> TYStudioMemberships { get; set; }
  21.         public DbSet<Role> Roles { get; set; }
  22.         public DbSet<Permission> Permissions { get; set; }
  23.         public DbSet<PermissionsInRoles> PermissionsInRoles { get; set; }
  24.  
  25.         protected override void OnModelCreating(DbModelBuilder modelBuilder)
  26.         {
  27.             modelBuilder.Entity<TYStudioMembership>()
  28.               .HasMany<Role>(r => r.Roles)
  29.               .WithMany(u => u.Members)
  30.               .Map(m =>
  31.               {
  32.                   m.ToTable("webpages_UsersInRoles");
  33.                   m.MapLeftKey("UserId");
  34.                   m.MapRightKey("RoleId");
  35.               });
  36.         }
  37.     }
  38. }

最后还需要修改上篇文章InitializeSimpleMembershipAttribute类。如果数据库存在就删除重建,这是为了生成数据库方便,数据库建好后就可以注释掉了。当然你也可以手动删除Sqlserver中的数据库,下面新加的代码就不需要了,效果是一样的.
  1. private class SimpleMembershipInitializer
  2.         {
  3.             public SimpleMembershipInitializer()
  4.             {
  5.                 Database.SetInitializer<TYStudioMembershipContext>(null);
  6.  
  7.                 try
  8.                 {
  9.                     using (var context = new TYStudioMembershipContext())
  10.                     {
  11.                         if (!context.Database.Exists())
  12.                         {
  13.                             // Create the SimpleMembership database without Entity Framework migration schema
  14.                             ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
  15.                         }
  16.                     }
  17.                     WebSecurity.InitializeDatabaseConnection("TYStudioUsersConnectionString", "UserProfile", "UserId", "UserName", autoCreateTables: true);
  18.                 }
  19.                 catch (Exception ex)
  20.                 {
  21.                     throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
  22.                 }
  23.             }
  24.         }

至此数据库的扩展就完成了。

编译运行程序(记得要点页面右上角的Register按钮)后,你会得到如下面截图的数据库:

下篇文章介绍如何使用SimpleMembership对Action进行具体的权限控制。

原创文章,转载请注明出处谢谢。



9 评论

  1. fabrice   •  

    您好,请问除了UserProfiles外,其他的类在哪扩展呢?全部在AccountModels.cs里吗?

  2. fabrice   •  

    Members = new List();提示:使用泛型 类型“System.Collections.Generic.List”需要 1 个类型参数这个List是引用了什么类呢?

  3. fabrice   •  

    modelBuilder.Entity()提示:无法从用法中推导出方法“System.Data.Entity.DbModelBuilder.Entity()”的类型实参。请尝试显式指定类型实参。

  4. alvin   •  

    你好!我想问一下你那个“TYStudioMembership.cs”是什么作用?小白的提问,见笑了

    • 天屹   •     作者

      TYStudioMembership用来存储一些membership的信息,用户名的密码和修改密码用到的一些验证,通常情况下只会用到password,

  5. Aran   •  

    没有向UserProfile添加字段前运行了项目 然后数据库中只有UserID 和UserName两个字段
    向UserProfile添加自己的字段,例如Email,PhoneNumber,Address等等。
    为什么我向UserProfile中添加了字段后 重新运行了项目
    然后去数据库中看了下表结构
    表结构中还是只有UserID 和UserName两个字段而没有我添加的新的字段呢?
    请赐教!

    • 天屹   •     作者

      数据库删了,重新生成以下应该能解决.

      • MVC   •  

        这样不合适啊,正在运行的项目怎么能这么干。如何通过这个Model直接变更数据库结构??

        • 天屹   •     作者

          正在运行的项目数据库那方面的东西好改。你先建立一个数据库,运行一下这个程序把各个表结构生成,然后手动的merge到你们原有的数据库,这样你们原有的数据库不就有表格了么,然后把web.config中的连接串改到新的库就可以了,记得注释一下自动生成表接口那块(不用注释也没关系,那段已经做了判断,判断有没有,有了就不加了), 麻烦的是把你需要的新权限一个个的加到原有的系统中。

fabrice进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>