Asp.Net MVC Identity 2.2.1 使用技巧(二)


之前我們看到了新生成的項目中跟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; 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM