這篇緊接着一來寫的,在第一篇中介紹了認證與受權,同時提出了這套機制其實就是模擬現實中的認證與受權。
一樣這篇介紹在這套機制下,用戶信息管理機制?這裏就會問了,上一篇中認證和受權不是都ok了嗎,怎麼會有一個管理機制呢?固然並不必定要使用下面這套機制,可是給了咱們很大的啓發。
在上一結中咱們頒發證書是這樣的:git
public IActionResult Authenticate() { var SchoolClaims = new List<Claim>() { new Claim(ClaimTypes.Name,"Jack"), new Claim(ClaimTypes.Email,"Jack@fmail.com") }; var LicensClaims = new List<Claim>() { new Claim(ClaimTypes.Name,"Jack.li"), new Claim(ClaimTypes.Email,"Jack@fmail.com"), new Claim("begin","2000.10.1") }; var SchoolIdentity = new ClaimsIdentity(SchoolClaims,"Student Identity"); var CarManagerIdentity = new ClaimsIdentity(LicensClaims, "Licens Identity"); var userPrincipal = new ClaimsPrincipal(new[] { SchoolIdentity, CarManagerIdentity }); HttpContext.SignInAsync(userPrincipal); return RedirectToAction("Index"); }
有沒有發現new Claim(ClaimTypes.Name,"Jack") 寫死了?個人信息是要從數據庫裏面查啊。
這時候微軟的框架就跳出來了,說用個人這套機制,幫你搞定,究竟是什麼機制呢?請看正文。小聲逼逼一句,微軟就喜歡搞全包工程。
正文均爲我的理解,若有不對請指出。數據庫
首先說起到一個結構,IdentityUser,這東西是真的博大精深,可是感受有點臃腫,這很微軟。
IdentityUser 這裏能夠簡單說明一下,就是存儲用戶信息的地方。
既然說到用戶存儲,那麼就要說起到數據庫了。
建立了一個AppDbContext:app
public class AppDbContext:IdentityDbContext { public AppDbContext(DbContextOptions<AppDbContext> options):base(options) { } }
之前咱們通常是繼承DbContext,DbContext是Ef的上下文。
這裏IdentityDbContext,是Ef的擴展,看下我添加了什麼。
紅色框內是我添加的。
在這裏我爲了演示使用內存數據庫memory,因此我多加了一個庫。
而後我在startup中配置使用memory數據庫。框架
services.AddDbContext<AppDbContext>(config =>{ config.UseInMemoryDatabase("Memery"); });
這樣就配置了,如今就解決了數據庫的問題。
一樣須要配置identity:async
services.AddIdentity<IdentityUser, IdentityRole>(config=> { config.Password.RequiredLength = 4; config.Password.RequireDigit = false; config.Password.RequireNonAlphanumeric = false; config.Password.RequireLowercase = false; config.Password.RequireUppercase = false; }).AddEntityFrameworkStores<AppDbContext>().AddDefaultTokenProviders();
有幾個關鍵的地方,就是config.Password.RequiredLength = 4;等幾個password的配置,
由於identetyUser 有默認的機制就是密碼必需要大寫,而後不小於6位密碼等,咱們在這裏所有去掉。
AddEntityFrameworkStores
AddDefaultTokenProviders() 默認提供生成token。這種token 用來幹啥呢?固然是用來證實用戶的了。好比咱們修改密碼的時候,咱們發現連接上有一個token,殊途同歸之妙哈。
services.ConfigureApplicationCookie(config => { config.Cookie.Name = "Identity.Cooke"; config.LoginPath = "/Home/Login"; });
加上驗證,當沒有登錄的時候去到登錄頁面。
好的配置咱們基本完成了。
接下來就是去實現登錄與註冊。post
public IActionResult Index() { return View(); } public IActionResult Secret() { return View(); } public IActionResult Login() { return View(); } public IActionResult Register() { return View(); } [HttpPost] public async Task<IActionResult> Login(string username, string password) { var user = await _userManager.FindByNameAsync(username); if (user != null) { //sign in var Signresult= await _signInManager.PasswordSignInAsync(user,password,false,false); if (Signresult.Succeeded) { return RedirectToAction("Secret"); } } return RedirectToAction("Index"); } [HttpPost] public async Task<IActionResult> Register(string username,string password) { var user = new IdentityUser { UserName = username, Email = "" }; var result=await _userManager.CreateAsync(user,password); if (result.Succeeded) { var Signresult = await _signInManager.PasswordSignInAsync(user, password, false, false); if (Signresult.Succeeded) { return RedirectToAction("Index"); } } return RedirectToAction("Index"); }
看到兩個http post:
先看Register:
建立了IdentityUser,用來存儲用戶信息。
_userManager 是用來管理user用戶的,好比說建立,刪除,修改,是identetyUser 內部機制。
建立過程以下:ui
public HomeController(UserManager<IdentityUser> userManager,SignInManager<IdentityUser> signInManager) { _userManager = userManager; _signInManager = signInManager; }
var result=await _userManager.CreateAsync(user,password); 若是建立用戶成功,那麼就進行登錄以下:code
var Signresult = await _signInManager.PasswordSignInAsync(user, password, false, false);
注意PasswordSignInAsync登錄的話會產生token,用於驗證咱們是否登錄。
當我註冊後,產生了token,以下:
看下登錄,其實咱們在註冊部分就已經介紹了登錄了。
我從新把代碼放下了:orm
var user = await _userManager.FindByNameAsync(username); if (user != null) { //sign in var Signresult= await _signInManager.PasswordSignInAsync(user,password,false,false); if (Signresult.Succeeded) { return RedirectToAction("Secret"); } } return RedirectToAction("Index");
發現就多了一步,根據名字去查找user,若是有這個user,而後去比較密碼。和平時寫code 差很少。
而後登錄後就能夠進入了咱們想進入的頁面。
若是咱們想loginout:
public async Task<IActionResult> Logout() { await _signInManager.SignOutAsync(); return RedirectToAction("Index"); }
把登錄和註冊的頁面貼下:
login:
<form action="/Home/Login" method="post"> <input type="text" name="username" value="" /> <input type="password" name="password" value="" /> <button type="submit">登錄</button> </form>
註冊:
<form action="/Home/Register" method="post"> <input type="text" name="username" value="" /> <input type="password" name="password" value="" /> <button type="submit">註冊</button> </form>
在上一篇中,就很疑問了,上一篇沒有登陸啊。
真的沒有登陸嗎?只是用證書去登陸了,否則怎麼能過的了檢查呢。
HttpContext.SignInAsync("CookieAuth", userPrincipal);
如今咱們的流程更加的明顯了,先要驗證用戶信息,好比說是否登陸了,這個過程至關於什麼呢?咱們用咱們的名字和指紋(password),去獲取到了咱們的身份證。有了這張身份證後咱們纔有其餘的證書,而後纔有根據證書去獲取一些權限。 後續介紹基本的配置,與原理。