介绍

  • 身份证:ClaimsIdentity
  • 身份证上面有我的名称:claim
  • ClaimsIdentity的持有者就是 ClaimsPrincipal

创建用户身份标识

  1. //创建用户身份标识
  2. var claimsIdentity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
  3. claimsIdentity.AddClaims(new List<Claim>()
  4. {
  5. new Claim(ClaimTypes.Sid, model.UserName),
  6. new Claim(ClaimTypes.Name, model.UserName),
  7. new Claim(ClaimTypes.Role, "admin"),
  8. });

创建用户身份标识

  1. public async Task<IActionResult> Login([FromBody] SysUser sysUser)
  2. {
  3. //使用ef获取用户
  4. var info = _context.SysUsers.Where(m => m.UserName == sysUser.UserName && m.PassWord == sysUser.PassWord).FirstOrDefault();
  5. if (info != null)
  6. {
  7. //创建一个身份认证
  8. var claims = new List<Claim>() {
  9. new Claim(ClaimTypes.Sid,info.Id.ToString()), //用户ID
  10. new Claim(ClaimTypes.Name,info.UserName) //用户名称
  11. };
  12. var identity = new ClaimsIdentity(claims, "TestLogin");
  13. var userPrincipal = new ClaimsPrincipal(identity);
  14. await HttpContext.SignInAsync("MyCookieAuthenticationScheme", userPrincipal, new AuthenticationProperties
  15. {
  16. ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
  17. IsPersistent = false,
  18. AllowRefresh = false
  19. });
  20. return Json(new
  21. {
  22. success = true
  23. });
  24. }
  25. else
  26. {
  27. return Json(new
  28. {
  29. success = false,
  30. message = "账户名密码错误!"
  31. });
  32. }
  33. }

claims-based authentication

  • ASP.NET Core 的验证模型是 claims-based authentication 。Claim 是对被验证主体特征的一种表述,比如:登录用户名是xxx,email是xxx,其中的“登录用户名”,“email”就是ClaimType.
  • 一组claims构成了一个identity,具有这些claims的identity就是 ClaimsIdentity
  1. var claims = new List<Claim>() {
  2. new Claim(ClaimTypes.Sid,info.Id.ToString()), //用户ID
  3. new Claim(ClaimTypes.Name,info.UserName) //用户名称
  4. };
  5. var identity = new ClaimsIdentity(claims, "Login");
  6. var userPrincipal = new ClaimsPrincipal(identity);
  7. ##一个ClaimsPrincipal可以持有多个ClaimsIdentity,就比如一个人既持有驾照,又持有护照.
  8. var userPrincipal = new ClaimsPrincipal(identity);
  9. await HttpContext.SignInAsync("MyCookieAuthenticationScheme", userPrincipal, new AuthenticationProperties
  10. {
  11. ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
  12. IsPersistent = false,
  13. AllowRefresh = false
  14. });
  15. 理解了Claim, ClaimsIdentity, ClaimsPrincipal这三个概念,就能理解生成登录Cookie为什么要用之前的代码。
  16. 要用Cookie代表一个通过验证的主体,必须包含Claim, ClaimsIdentity, ClaimsPrincipal这三个信息,ClaimsPrincipal就是持有证件的人,ClaimsIdentity就是证件,"Login"就是证件类型(这里假设是驾照),Claim就是驾照中的信息。
  17. 我们在需要验证权限的Action上面加入[Authorize] 就可以了, 如果没有登录状态,会跳转到Login页面, 如何配置跳转,已经各种其他的配置,见Startup.cs文件、
  18. public IActionResult Index()
  19. {//取用户信息
  20. var userId = User.FindFirst(ClaimTypes.Sid).Value;
  21. var userName = User.Identity.Name;
  22. return View();
  23. }