.net core identity(一)簡單運用
1.net core identity涉及到很多知識,很多概念包括Claims,Principal等等概念需要我們一步步學習才能掌握其原理,有兩篇部落格是比較好的介紹該框架的,
https://segmentfault.com/a/1190000014966349
http://www.cnblogs.com/savorboard/p/aspnetcore-identity.html
2.我在這裡先不涉及到上面2篇部落格提到的較為高深的內容,而是按照Adam Freeman的.net core mvc中相關程式碼來做一個小例子
3.首先我們需要明確一個概念是AspNetCore.Identity這一框架是為我們身份認證和許可權管理統一做出的抽象,使我們可以通過實現相關介面或方法來完成身份認證的模組,
而不用自己去實現相關繁複的功能.那麼下面就進入正題
4.Microsoft.AspNetCore.Identity 名稱空間下IdentityUser 為我們定義了使用者身份的基類,這裡展示一部分屬性
1 public class IdentityUser<TKey> where TKey : IEquatable<TKey>{ 2 3 public IdentityUser(); 4 5 public IdentityUser(string userName); 6 7 public virtual DateTimeOffset? LockoutEnd { get; set; } 8 9 public virtual int AccessFailedCount { get; set; } 10 11 public virtual string UserName { get; set; } 12 13 public virtual string Email { get; set; } 14 15 }
5.我們可以通過實現IdentityUser來使用
1 public class AppUser: IdentityUser 2 { 3 //加入其它屬性 4 }
6.實現IdentityDbContext配置上下文能用到ef的相關功能
1 public class AppIdentityDbContext: IdentityDbContext<AppUser> 2 { 3 4 //public DbSet<AppUser> appuser 5 public AppIdentityDbContext(DbContextOptions<AppIdentityDbContext> options) 6 : base(options) { } 7 }
7.Startup啟動類配置,
AddIdentity方法指定使用者和使用者的角色類,我們用我們定義的AppUser 和系統定義的IdentityRole
AddEntityFrameworkStores 用於配置應用Ef哪個上下文來對使用者資訊做儲存
AddDefaultTokenProviders用於配置令牌的實現,是cookie還是jwt等等,這一塊不熟,
最後利用app.UseAuthentication()將identity加入管道中.
下面的一下配置用來配置使用者名稱,郵箱,密碼的一些規則,可以不寫
1 services.AddDbContext<AppIdentityDbContext>(options => 2 options.UseSqlServer(Configuration["Data:SportStoreIdentity:ConnectionString"])); 3 4 5 services.AddIdentity<AppUser, IdentityRole>(option=> { 6 //郵箱必須唯一 7 option.User.RequireUniqueEmail = true; 8 //使用者名稱只許小寫字母拼寫 9 option.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz"; 10 option.Password.RequiredLength = 6; 11 option.Password.RequireNonAlphanumeric = false; 12 option.Password.RequireLowercase = false; 13 option.Password.RequireUppercase = false; 14 option.Password.RequireDigit = false; 15 16 }) 17 .AddEntityFrameworkStores<AppIdentityDbContext>() 18 .AddDefaultTokenProviders();
public void Configure(IApplicationBuilder app) {
app.UseStatusCodePages();
app.UseDeveloperExceptionPage();
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvcWithDefaultRoute();
}
8.createModel 和Controller,可以看出UserManager是對使用者資訊做出管理的一個類,你們可以進入看看有什麼方法,最後呼叫就不用我說了吧
1 public class CreateModel { 2 [Required] 3 public string Name { get; set; } 4 [Required] 5 public string Email { get; set; } 6 [Required] 7 public string Password { get; set; } 8 }
1 public class AdminController : Controller 2 { 3 4 private UserManager<AppUser> userManager; 5 public AdminController(UserManager<AppUser> usrMgr 6 { 7 userManager = usrMgr; 8 } 9
public IActionResult Index(){
return View(userManager.Users);
}
10 public ViewResult Create() => View(); 11 12 [HttpPost] 13 public async Task<IActionResult> Create(CreateModel model) 14 { 15 if (ModelState.IsValid) 16 { 17 AppUser user = new AppUser 18 { 19 UserName = model.Name, 20 Email = model.Email 21 }; 22 23 IdentityResult result 24 = await userManager.CreateAsync(user, model.Password); 25 if (result.Succeeded) 26 { 27 return RedirectToAction("Index"); 28 } 29 else 30 { 31 foreach (IdentityError error in result.Errors) 32 { 33 ModelState.AddModelError("", error.Description); 34 } 35 } 36 } 37 return View(model); 38 } 39 40 }
9.果然是技術不夠,寫這麼點就有點力不從心,真是羨慕那些長篇大論的大神,這就是我的理解,肯定有欠缺的地方,望大家指正