介绍
- 身份证:ClaimsIdentity
- 身份证上面有我的名称:claim
- ClaimsIdentity的持有者就是 ClaimsPrincipal
创建用户身份标识
//创建用户身份标识
var claimsIdentity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
claimsIdentity.AddClaims(new List<Claim>()
{
new Claim(ClaimTypes.Sid, model.UserName),
new Claim(ClaimTypes.Name, model.UserName),
new Claim(ClaimTypes.Role, "admin"),
});
创建用户身份标识
public async Task<IActionResult> Login([FromBody] SysUser sysUser)
{
//使用ef获取用户
var info = _context.SysUsers.Where(m => m.UserName == sysUser.UserName && m.PassWord == sysUser.PassWord).FirstOrDefault();
if (info != null)
{
//创建一个身份认证
var claims = new List<Claim>() {
new Claim(ClaimTypes.Sid,info.Id.ToString()), //用户ID
new Claim(ClaimTypes.Name,info.UserName) //用户名称
};
var identity = new ClaimsIdentity(claims, "TestLogin");
var userPrincipal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync("MyCookieAuthenticationScheme", userPrincipal, new AuthenticationProperties
{
ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
IsPersistent = false,
AllowRefresh = false
});
return Json(new
{
success = true
});
}
else
{
return Json(new
{
success = false,
message = "账户名密码错误!"
});
}
}
claims-based authentication
- ASP.NET Core 的验证模型是 claims-based authentication 。Claim 是对被验证主体特征的一种表述,比如:登录用户名是xxx,email是xxx,其中的“登录用户名”,“email”就是ClaimType.
- 一组claims构成了一个identity,具有这些claims的identity就是 ClaimsIdentity
var claims = new List<Claim>() {
new Claim(ClaimTypes.Sid,info.Id.ToString()), //用户ID
new Claim(ClaimTypes.Name,info.UserName) //用户名称
};
var identity = new ClaimsIdentity(claims, "Login");
var userPrincipal = new ClaimsPrincipal(identity);
##一个ClaimsPrincipal可以持有多个ClaimsIdentity,就比如一个人既持有驾照,又持有护照.
var userPrincipal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync("MyCookieAuthenticationScheme", userPrincipal, new AuthenticationProperties
{
ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
IsPersistent = false,
AllowRefresh = false
});
理解了Claim, ClaimsIdentity, ClaimsPrincipal这三个概念,就能理解生成登录Cookie为什么要用之前的代码。
要用Cookie代表一个通过验证的主体,必须包含Claim, ClaimsIdentity, ClaimsPrincipal这三个信息,ClaimsPrincipal就是持有证件的人,ClaimsIdentity就是证件,"Login"就是证件类型(这里假设是驾照),Claim就是驾照中的信息。
我们在需要验证权限的Action上面加入[Authorize] 就可以了, 如果没有登录状态,会跳转到Login页面, 如何配置跳转,已经各种其他的配置,见Startup.cs文件、
public IActionResult Index()
{//取用户信息
var userId = User.FindFirst(ClaimTypes.Sid).Value;
var userName = User.Identity.Name;
return View();
}