.NET Core如何实现Cookie与JWT结合的混合认证授权机制?

摘要:前言 为防止JWT Token被窃取,我们将Token置于Cookie中,但若与第三方对接,调用我方接口进行认证、授权此时仍需将Token置于请求头,通过实践并联系理论,我们继续开始整活!首先我们实现Cookie认证,然后再次引入JWT,最
前言 为防止JWT Token被窃取,我们将Token置于Cookie中,但若与第三方对接,调用我方接口进行认证、授权此时仍需将Token置于请求头,通过实践并联系理论,我们继续开始整活!首先我们实现Cookie认证,然后再次引入JWT,最后在结合二者使用时联系其他我们可能需要注意的事项 Cookie认证 在startup中我们添加cookie认证服务,如下: services.AddAuthentication(options => { options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; }) .AddCookie(options => { options.ExpireTimeSpan = TimeSpan.FromMinutes(1); options.Cookie.Name = "user-session"; options.SlidingExpiration = true; }); 接下来则是使用认证和授权中间件,注意将其置于路由和终结点终结点之间,否则启动也会有明确异常提示 app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { ...... }); 我们给出测试视图页,并要求认证即控制器添加特性 [Authorize] public class HomeController : Controller { public IActionResult Index() { return View(); } } 当进入首页,未认证默认进入account/login,那么接下来创建该视图 public class AccountController : Controller { [AllowAnonymous] public IActionResult Login() { return View(); } ...... } 我们启动程序先看看效果 如上图,自动跳转至登录页,此时我们点击模拟登录按钮,发起请求去模拟登录(发起ajax请求代码就不占用篇幅了) /// <summary> /// 模拟登录 /// </summary> /// <returns></returns> [HttpPost] [AllowAnonymous] public async Task<IActionResult> TestLogin() { var claims = new Claim[] { new Claim(ClaimTypes.Name, "Jeffcky"), }; var claimsIdentity = new ClaimsIdentity(claims, "Login"); await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity)); return Ok(); } 上述无非就是构建身份以及该身份下所具有的身份属性,类似个人身份证唯一标识个人,身份证上各个信息即表示如上声明,同时呢,肯定要调用上下文去登录,在整个会话未过期之前,根据认证方案获取对应处理方式,最后将相关信息进行存储等等,有兴趣的童鞋可以去了解其实现细节哈 当我们请求过后,再次访问首页,将看到生成当前会话信息,同时我们将会话过期设置为1分钟,在1分钟内未进行会话,将自动重定向至登录页,注意如上标注并没有值,那么这个值可以设置吗?当然可以,在开始配置时我们并未给出,那么这个属性又代表什么含义呢? options.Cookie.MaxAge = TimeSpan.FromMinutes(2); 那么结合ExpireTimeSpan和MaxAge使用,到底代表什么意思呢?我们暂且撇开滑动过期设置 ExpireTimeSpan表示用户身份认证票据
阅读全文