1. 程式人生 > >.net core identity(一)簡單運用

.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.果然是技術不夠,寫這麼點就有點力不從心,真是羨慕那些長篇大論的大神,這就是我的理解,肯定有欠缺的地方,望大家指正