之前我們看到了新生成的項目中跟identity有關的有四個文件,這些文件是基礎功能,並未開啟identity的全部功能。現在我們先啟用角色功能。
1、在App_Start文件夾中的IdentityConfig.cs中添加角色控制器。
在namespace xxx內(即最后一個“}”前面)添加 角色控制類
代碼如下:
1 //配置此應用程序中使用的應用程序角色管理器。RoleManager 在 ASP.NET Identity 中定義,並由此應用程序使用。 2 public class ApplicationRoleManager : RoleManager<IdentityRole> 3 { 4 public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore) 5 : base(roleStore) 6 { 7 } 8 9 public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context) 10 { 11 return new ApplicationRoleManager(new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>())); 12 } 13 }
2、修改startup文件,啟用角色管理器(RoleManager)。
打開App_Start文件夾中的startup.auth.cs 在 public void ConfigureAuth(IAppBuilder app) 方法中(約為19行左右)加入 app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
修改完成后的代碼如下:
1 // 配置數據庫上下文、用戶管理器和登錄管理器,以便為每個請求使用單個實例 2 app.CreatePerOwinContext(ApplicationDbContext.Create); 3 app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 4 app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); //添加的角色管理器 5 app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
這里最基本的角色功能啟用就完成了。
可選操作1:
這個可選操作用於在創建網站的時候,像網站數據庫中添加一個管理用戶。如果直接發布給別人用的話 還是挺不錯的,自己用的話可以省略掉。
一、在identityconfig.cs可以配置添加一個用戶(用戶名為:“admin@123.com”,密碼為“Admin@123456”)並把該用戶添加到角色("Admin")中。
代碼如下:
1 public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext> 2 { 3 protected override void Seed(ApplicationDbContext context) { 4 InitializeIdentityForEF(context); 5 base.Seed(context); 6 } 7 8 //創建用戶名為admin@123.com,密碼為“Admin@123456”並把該用戶添加到角色組"Admin"中 9 public static void InitializeIdentityForEF(ApplicationDbContext db) { 10 var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); 11 var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>(); 12 const string name = "admin@123.com";//用戶名 13 const string password = "Admin@123456";//密碼 14 const string roleName = "Admin";//用戶要添加到的角色組 15 16 //如果沒有Admin用戶組則創建該組 17 var role = roleManager.FindByName(roleName); 18 if (role == null) { 19 role = new IdentityRole(roleName); 20 var roleresult = roleManager.Create(role); 21 } 22 23 //如果沒有admin@123.com用戶則創建該用戶 24 var user = userManager.FindByName(name); 25 if (user == null) { 26 user = new ApplicationUser { UserName = name, Email = name }; 27 var result = userManager.Create(user, password); 28 result = userManager.SetLockoutEnabled(user.Id, false); 29 } 30 31 // 把用戶admin@123.com添加到用戶組Admin中 32 var rolesForUser = userManager.GetRoles(user.Id); 33 if (!rolesForUser.Contains(role.Name)) { 34 var result = userManager.AddToRole(user.Id, role.Name); 35 } 36 } 37 }
二、修改Models文件夾中IdentityModels.cs
在public class ApplicationDbContext : IdentityDbContext<ApplicationUser>類中添加初始化設置。
代碼如下:
1 static ApplicationDbContext() 2 { 3 // 在第一次啟動網站時初始化數據庫添加管理員用戶憑據和admin 角色到數據庫 4 Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer()); 5 }
可選操作2:自定義用戶名和密碼驗證規則
自定義用戶名驗證規則,例如QQ.com。
要完成這個功能我們可以添加自定義的用戶驗證策略,只要繼承繼承UserValidator<T> 然后 Override ValidateAsync 方法。
1、為了管理方便,先創建一個文件夾“zidingyi”,在文件夾中添加一個名稱為“CustomUserValidator.cs”的類文件,寫入代碼如下:
1 //自定義用戶名email只支持QQ.com域名 2 3 public class CustomUserValidator : UserValidator<ApplicationUser> 4 { 5 6 public CustomUserValidator(ApplicationUserManager mgr) 7 : base(mgr) 8 { 9 } 10 //重寫ValidateAsync方法 11 public override async Task<IdentityResult> ValidateAsync(ApplicationUser user) 12 { 13 IdentityResult result = await base.ValidateAsync(user); 14 15 if (!user.Email.ToLower().EndsWith("@QQ.com")) 16 { 17 var errors = result.Errors.ToList(); 18 errors.Add("Email 地址只支持QQ.com域名"); 19 result = new IdentityResult(errors); 20 } 21 return result; 22 } 23 }
2、將自定義的UserValidator 附加到User Manger 對象上,操作如下:
打開App_Start/Identityconfig.cs 找到public static ApplicationUserManager Create()方法,把manager.UserValidator = new UserValidator<ApplicationUser>(manager)中的UserValidator替換為manager.UserValidator = new zidingyi.CustomUserValidator(manager);
可選操作3:自定義密碼驗證規則
自定義密碼驗證規則,如禁止類似“12345”的密碼。
同上,完成這個我們只要繼承PasswordValidator 並且Override ValidateAsync方法即可。
1、在文件夾“zidingyi”,添加一個名稱為“CustomPasswordValidator.cs”的類文件,寫入代碼如下:
1 //自定義用戶密碼禁止類似12345 記得添加對應的using 2 public class CustomPasswordValidator : PasswordValidator 3 { 4 //重寫ValidateAsync方法 5 public override async Task<IdentityResult> ValidateAsync(string pass) 6 { 7 IdentityResult result = await base.ValidateAsync(pass); 8 if (pass.Contains("12345")) 9 { 10 var errors = result.Errors.ToList(); 11 errors.Add("密碼不能為連續的數字"); 12 result = new IdentityResult(errors); 13 } 14 return result; 15 } 16 }
2、將自定義的PasswordValidator 附加到UserManger 對象上,操作如下:
打開App_Start/Identityconfig.cs 找到public static ApplicationUserManager Create()方法,把manager.PasswordValidator = new PasswordValidator(54行)中的PasswordValidator替換為manager.PasswordValidator = new zidingyi.CustomPasswordValidator;