如代码所示,在定义授权策略时,我们定义了三个重定向的页面,去告诉 Cookie 授权策略这里对应的页面在何处,同时,因为身份验证 Cookie 的默认过期时间会持续到关闭浏览器为止,也就是说,只要用户不点击退出按钮并且不关闭浏览器,用户会一直处于已经登录的状态,所以这里我们设定 20 分钟的过期时间,避免一些不必要的风险
至此,对于 Cookie 认证策略的配置就完成了,现在就可以在 Startup.Configure 方法中添加 UseAuthentication 中间件到 HTTP 管道中,实现对于网站认证的启用,这里需要注意,因为是先认证再授权,所以中间件的添加顺序不可以颠倒
public class Startup { public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseRouting(); // 添加认证授权(顺序不可以颠倒) // app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( "default", "{controller=Home}/{action=Index}/{id?}"); }); } }此时,当我们再次访问系统时,因为没有经过认证,自动触发了重定向到系统登录页面的操作,而这里重定向跳转的页面就是上文代码中配置的 LoginPath 的属性值
2.3、登录、登出实现当认证策略配置完成之后,就可以基于选择的策略来进行登录功能的实现。这里的登录页面上的按钮,模拟了一个登录表单提交,当点击之后会触发系统的认证逻辑,实现代码如下所示。这里别忘了将登录事件的 Action 上加上 AllowAnonymous 特性从而允许匿名访问
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<IActionResult> LoginAsync() { // 1、Todo:校验账户、密码是否正确,获取需要的用户信息 // 2、创建用户声明信息 var claims = new List<Claim> { new Claim(ClaimTypes.Name, "张三"), new Claim(ClaimTypes.MobilePhone, "13912345678") }; // 3、创建声明身份证 var claimIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); // 4、创建声明身份证的持有者 var claimPrincipal = new ClaimsPrincipal(claimIdentity); // 5、登录 await HttpContext.SignInAsync(claimPrincipal); return Redirect("http://www.likecs.com/"); }在整块的代码中,涉及到三个主要的对象,Claim、ClaimsIdentity 和 ClaimsPrincipal,通过对于这三个对象的使用,从而实现将用户登录成功后系统所需的用户信息包含在 Cookie 中
三个对象之间的区别,借用理解ASP.NET Core验证模型(Claim, ClaimsIdentity, ClaimsPrincipal)不得不读的英文博文这篇博客的解释来说明
Claim:被验证主体特征的一种表述,比如:登录用户名是...,email是...,用户Id是...,其中的“登录用户名”,“email”,“用户Id”就是 ClaimType
ClaimsIdentity:一组 claims 构成了一个 identity,具有这些 claims 的 identity 就是 ClaimsIdentity ,驾照就是一种 ClaimsIdentity,可以把 ClaimsIdentity理解为“证件”,驾照是一种证件,护照也是一种证件
ClaimsPrincipal:ClaimsIdentity 的持有者就是 ClaimsPrincipal ,一个 ClaimsPrincipal 可以持有多个 ClaimsIdentity,就比如一个人既持有驾照,又持有护照
最后,通过调用 HttpContext.SignInAsync 方法就可以完成登录功能,可以看到,当 Cookie 被清除后,用户也就处于登出的状态了,当然,我们也可以通过手动的调用 HttpContext.SignOutAsync 来实现登出
2.4、获取用户信息对于添加在 Claim 中的信息,我们可以通过指定 ClaimType 的方式获取到,在 View 和 Controller 中,我们可以直接通过下面的方式进行获取,这里使用到的 User 其实就是上文中提到的 ClaimsPrincipal
var userName = User.FindFirst(ClaimTypes.Name)?.Value;