使用用戶管理器之用戶注冊
配置數據庫在appsettings.json,系統默認生成的是連接到sqlserver服務中的數據庫。如果想連接到.mdb文件上(便攜型數據庫)請參照我的另一篇博文《.net 和 core 數據庫連接字符串 》中關於《Asp.net Core 數據庫離線文件的連接(特別感謝“張不水”兄的大力幫助。)》的部分。
1、修改密碼強度和用戶郵箱驗證規則:(微軟官方示例采用的是后面的方式)
打開Startup.cs,在public class Startup{}內找public void ConfigureServices(IServiceCollection services){}修改services.AddIdentity<ApplicationUser, IdentityRole>()為如下代碼:
1 services.AddIdentity<ApplicationUser, IdentityRole>(options => 2 { 3 // 配置身份選項 4 // 密碼配置 5 options.Password.RequireDigit = false;//是否需要數字(0-9). 6 options.Password.RequiredLength = 6;//設置密碼長度最小為6 7 options.Password.RequireNonAlphanumeric = false;//是否包含非字母或數字字符。 8 options.Password.RequireUppercase = false;//是否需要大寫字母(A-Z). 9 options.Password.RequireLowercase = false;//是否需要小寫字母(a-z). 10 11 // 鎖定設置 12 options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);//賬戶鎖定時長30分鍾 13 options.Lockout.MaxFailedAccessAttempts = 10;//10次失敗的嘗試將賬戶鎖定 14 15 // Cookie常用設置 16 options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(150);//Cookie 保持有效的時間150天。 17 options.Cookies.ApplicationCookie.LoginPath = "/Account/LogIn";//在進行登錄時自動重定向。 18 options.Cookies.ApplicationCookie.LogoutPath = "/Account/LogOff";//在進行注銷時自動重定向。 19 20 //cookie擴展設置(通常不用) 21 options.Cookies.ApplicationCookie.CookieName = "YouAppCookieName";//用於保持身份的 Cookie 名稱。 默認值為“.AspNet.Cookies”。 22 options.Cookies.ApplicationCookie.AccessDeniedPath = "/Account/AccessDenied";//被拒絕訪問或路徑無效后的重定向。 23 options.Cookies.ApplicationCookie.AutomaticAuthenticate = true;//自動認證 24 options.Cookies.ApplicationCookie.AuthenticationScheme = Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationDefaults.AuthenticationScheme;//選定認證方案的名稱。 25 options.Cookies.ApplicationCookie.ReturnUrlParameter = Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationDefaults.ReturnUrlParameter;//登陸或退出后執行動作返回到原來的地址。 26 27 // 用戶設置 28 options.User.RequireUniqueEmail = true; //是否Email地址必須唯一 29 })
或者在AddDefaultTokenProviders();的后面 services.AddMvc();前面添加如下代碼(微軟官方示例代碼形式,推薦)
1 services.Configure<IdentityOptions>(options => 2 { 3 // 配置身份選項 4 // 密碼配置 5 options.Password.RequireDigit = false;//是否需要數字(0-9). 6 options.Password.RequiredLength = 6;//設置密碼長度最小為6 7 options.Password.RequireNonAlphanumeric = false;//是否包含非字母或數字字符。 8 options.Password.RequireUppercase = false;//是否需要大寫字母(A-Z). 9 options.Password.RequireLowercase = false;//是否需要小寫字母(a-z). 10 11 // 鎖定設置 12 options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);//賬戶鎖定時長30分鍾 13 options.Lockout.MaxFailedAccessAttempts = 10;//10次失敗的嘗試將賬戶鎖定 14 15 // Cookie常用設置 16 options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(150);//Cookie 保持有效的時間150天。 17 options.Cookies.ApplicationCookie.LoginPath = "/Account/LogIn";//在進行登錄時自動重定向。 18 options.Cookies.ApplicationCookie.LogoutPath = "/Account/LogOff";//在進行注銷時自動重定向。 19 20 // 用戶設置 21 options.User.RequireUniqueEmail = true; //是否Email地址必須唯一 22 });
2、打開Controllers目錄下的AccountController.cs
找到 public async Task<IActionResult> Register(RegisterViewModel model, string returnUrl = null) (110行)這下面的var user = new ApplicationUser { UserName = model.Email, Email = model.Email };(115行)這里兩個參數都是綁定的email。
改為var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };
更改后vs會提示下紅波浪線(錯誤),選擇糾錯為“生成屬性”的哪一項。注意:自動生成會是public string UserName { get; internal set; } 必須把internal set改為set,否則后期無法獲取到值。
3、修改用戶注冊的數據模型:修改Models文件夾下AccountViewModels目錄下RegisterViewModel.cs模型內的public class RegisterViewModel 中添加 public string UserName { get; set; },好了在上面堆你想要的規則吧。
1 [Required] 2 [StringLength(20, ErrorMessage = "{0} 必須至少包含 {2} 個字符,最多20個字符。", MinimumLength = 6)] 3 [Display(Name = "用戶賬號")] 4 [DataType(DataType.Text)] 5 [RegularExpression("^[a-zA-Z0-9_]{6,20}$", ErrorMessage = "用戶名由字母或數字組成。")] 6 public string UserName { get; set; }
為方便大家這是修改好的代碼
1 public class RegisterViewModel 2 { 3 [Required] 4 [EmailAddress] 5 [Display(Name = "電子信箱")] 6 public string Email { get; set; } 7 8 [Required] 9 [StringLength(100, ErrorMessage = "請在 {0} 填入最少 {2} 最大 {1} 個字符。", MinimumLength = 6)] 10 [DataType(DataType.Password)] 11 [Display(Name = "用戶密碼")] 12 public string Password { get; set; } 13 14 [DataType(DataType.Password)] 15 [Display(Name = "確認密碼")] 16 [Compare("Password", ErrorMessage = "請確保和用戶密碼一致。")] 17 public string ConfirmPassword { get; set; } 18 19 [Required] 20 [StringLength(20, ErrorMessage = "請在 {0} 填入最少 {2} 最大 {1} 個字符。", MinimumLength = 6)] 21 [Display(Name = "用戶賬號")] 22 [DataType(DataType.Text)] 23 [RegularExpression("^[a-zA-Z0-9_]{6,20}$", ErrorMessage = "用戶名由字母或數字組成。")] 24 public string UserName { get; set; } 25 }
4、在Views文件夾的Account中的register.cshtml文件中添加“用戶賬號”代碼:
1 <div class="form-group"> 2 <label asp-for="UserName" class="col-md-2 control-label"></label> 3 <div class="col-md-10"> 4 <input asp-for="UserName" class="form-control" /> 5 <span asp-validation-for="UserName" class="text-danger"></span> 6 </div> 7 </div>
大家可以看下,這里的代碼和之前的已經不一樣了,隨着TagHelper的更新,這里的代碼也變為 asp-for了。TagHelper的資料請參閱這里。
5、修改login,因為改為了用戶名注冊,如果還用email登陸的話,一定出現錯誤。
首先在ViewModels文件夾下找LoginViewModel.cs,在模型內添加 public string UesrName { get; set; },好了在上面堆你想要的規則吧。
1 [Required] 2 [StringLength(20, ErrorMessage = "{0} 必須至少包含 {2} 個字符,最多20個字符。", MinimumLength = 6)] 3 [Display(Name = "用戶賬號")] 4 [DataType(DataType.Text)] 5 [RegularExpression("^[a-zA-Z0-9_]{6,20}$", ErrorMessage ="用戶名由字母或數字組成。")] 6 public string UserName { get; set; }
接着把email模型項去掉或者注釋掉,否則你登陸不上去且還不給提示。
6、在Views文件夾中的login.cshtml文件中原來為“email”的地方改為“UserName”。
7、打開AccountController.cs文件,找到 public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) 這個方法
把 var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
改為var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, lockoutOnFailure: false);
現在,各位可以試試了。