这篇紧接着一来写的,在第一篇中介绍了认证与授权,同时提出了这套机制其实就是模拟现实中的认证与授权。
同样这篇介绍在这套机制下,用户信息打点机制?这里就会问了,上一篇中认证和授权不是都ok了吗,怎么会有一个打点机制呢?固然并不必然要使用下面这套机制,但是给了我们很大的启发。
在上一结中我们公布证书是这样的:
public IActionResult Authenticate()
{
var SchoolClaims = new List<Claim>()
{
new Claim(ClaimTypes.Name,"Jack"),
new Claim(ClaimTypes.Email,"[email protected]")
};
var LicensClaims = new List<Claim>()
{
new Claim(ClaimTypes.Name,"Jack.li"),
new Claim(ClaimTypes.Email,"[email protected]"),
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:
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:
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() 添加EF 存储实现。
AddDefaultTokenProviders() 默认供给生成token。这种token 用来干啥呢?固然是用来证明用户的了。好比我们改削暗码的时候,我们发明链接上有一个token,异曲同工之妙哈。
services.ConfigureApplicationCookie(config =>
{
config.Cookie.Name = "Identity.Cooke";
config.LoginPath = "/Home/Login";
});
加上验证,当没有登陆的时候去到登陆页面。
好的配置我们根基完成了。
接下来就是去实现登陆与注册。
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 内部机制。
创建过程如下:
public HomeController(UserManager<IdentityUser> userManager,SignInManager<IdentityUser> signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}