【导读】JWT认证方式目前已被广泛使用,一直以来我们将token放在请求头中的Authorization中,若通过此种方式,一旦token被恶意窃取,攻击者可肆意对用户可访问资源进行任意索取

我们大多都是通过登录成功后,响应AccessToken,然后由前端将token存储在相关Storage中,然后每次将其放请求头而认证请求,由于token是极其敏感信息,所以我们不能将其交由前端去处理,而应由后台获取对前端不可见

对安全有较高要求的平台,我们通过Http Only Cookie来解决token恶意窃取问题

Http Only Cookie

Http Only Cookie简言之则是将相关信息响应时存储在Cookie中,而客户端脚本无法访问,每次请求时,则将自动携带所有信息到服务器。例如,京东存储相关信息

接下来我们看看在.NET Core中如何将AccessToken以Http Only方式存储在Cookie中

[AllowAnonymous]
[HttpGet("api/test/get")]
public IActionResult Get()
{Response.Cookies.Append("x-access-token", GenerateToken(),new CookieOptions(){Path = "/",HttpOnly = true});return Ok();
}

如上,我们模拟登录成功,并不返回AccessToken,而是将其写入到响应头中,上述Cookie选项HttpOnly为true即表示客户端脚本不可访问

此时我们来访问如下需认证接口

[HttpGet("api/test/say")]
public string Say()
{return "Hello World";
}

用过JWT的童鞋都知道,标准模式则是将AccessToken写入到Authorization中,即请求头【Authorization: Bearer ......】,那么上述是如何认证成功而请求到接口的呢?

当我们添加JWT认证时,每次请求在其对应事件OnMessageReceived中将自动获取请求头Authorization中的值,将其赋值给context.Token

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{......options.Events = new JwtBearerEvents{OnMessageReceived = context =>{//Bearer Tokencontext.Token = "";  return Task.CompletedTask;}};
});

你问我是怎么知道的,我是猜的吗,当然不是,丢出官方源码就知道了,直接找到JWT如何处理认证则一目了然

protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{string token = null;// Give application opportunity to find from a different location, adjust, or reject tokenvar messageReceivedContext = new MessageReceivedContext(Context, Scheme, Options);// event can set the tokenawait Events.MessageReceived(messageReceivedContext);if (messageReceivedContext.Result != null){return messageReceivedContext.Result;}// If application retrieved token from somewhere else, use that.token = messageReceivedContext.Token;if (string.IsNullOrEmpty(token)){string authorization = Request.Headers[HeaderNames.Authorization];// If no authorization header found, nothing to process furtherif (string.IsNullOrEmpty(authorization)){return AuthenticateResult.NoResult();}}.......
}

到这里我们知道了自动获取Token的原理,我们修改了Token存储方式,照葫芦画瓢就好,如此将覆盖默认标准模式,如下:

OnMessageReceived = context =>
{var accessToken = context.Request.Cookies["x-access-token"];if (!string.IsNullOrEmpty(accessToken)){context.Token = accessToken;}return Task.CompletedTask;
}

从分析自动获取Token原理,我们也可知道,若与第三方对接,依然可以使用请求头Authorization标准模式认证,因为Cookie为空,再次获取Authorization值

注意:发现若将前端未置于wwwroot下,即完全前后分离,涉及到跨域的情况下,比如使用的是axios封装请求,那么应该必须在请求头中添加【withCredentials:true 】,否则使用Http Only将无效,出现401

额外意外发现一个很有意思的问题,未深入研究,这里当做小知识了解下就好,或许是我自以为发现新大陆了呢

当我们创建AccessToken时,都会设置一个过期时间,我们知道此过期时间肯定不会设置过长,但是若在比如移动端微信小程序中,若设置时间不长,必然要考虑刷新Token问题,为了懒一点,我们将Token设置为永不过期,那么JWT支持吗?

当然支持,只不过根据我刚好尝试了几次,找到了JWT永不过期的上限,最大只能是16年,若超过此临界点,比如17年,如下:

将会出现401,具体错误如下:

了解,了解就好,也没啥鸟用,我也是经常会瞎想,比如考虑某些可能存在的极限情况

Http Only Cookie保护AccessToken相关推荐

  1. 浏览器阻挡cookies_浏览器设置阻止第三方Cookie保护自己隐私

    当我们在某些大型网站上搜索一些东西时,在另外的一些网站出现了你搜索的东西的相关广告,这种现象的出现说明我们的隐私已经被跟踪.这种侵犯我们用户隐私现象的出现,要归功于第三方cookie所带来的副作用(隐 ...

  2. html5 ios cookie,iOS设置cookie到web遇到的坑

    获取本地的cookie,[SystemConfigure shareSystemConfigure].get_kHttpURL]留意用自己本地的域名,获取本地的登录的cookie信息 - (NSStr ...

  3. 15.10. Session/Cookie

    为什么我要在这里提Session和Cookie,这也大型站点必须要处理问题. 15.10.1. Session 在集群环境中与单服务器是不一样的,集群组成可分为调度服务器和节点,节点数量不定,单个节点 ...

  4. 前后端分离单点登录SSO实现方案 淘宝、京东跨域获取Cookie、OAuth2、QQ客户端多种模式

    演示Demo站点 http://sso.exrick.cn 开源版Github地址 https://github.com/Exrick/x-boot) 开发文档 https://www.kanclou ...

  5. springboot操作cookie

    在响应中添加cookie @RequestMapping(value="/casLogin", method= RequestMethod.GET) public CommonRe ...

  6. 网络攻防-20169213-刘晶-第六周作业

    教材学习内容 网络安全CIA属性:机密性(Confidentiality).完整性(Integ rity).可用性(Availability).其他两个补充属性:真实性(Authentication) ...

  7. shell学习笔记--自我总结

    一.文件 touch file # 创建空白文件 rm -rf 目录名 # 不提示删除非空目录(-r:递归删除 -f强制) dos2unix # windows文本转linux文本 unix2dos ...

  8. Windows内存保护机制及绕过方法

    0 目录 GS编译 SafeSEH机制 SEH覆盖保护 数据执行保护(DEP) 地址随机化(ASLR) 1 GS编译 1.1 基本原理 Windows操作系统为解决栈溢出漏洞的问题引入了一个对策--G ...

  9. Yii2 认证实现原理和示例

    Yii的用户认证分为两个部分,一个是User组件,负责管理用户认证状态的,包括登录,登出,检测当前登录状态等,源文件位于vender/yiisoft/yii2/web/User.php.另一个是实现接 ...

最新文章

  1. 华为什么时候开始升级鸿蒙,鸿蒙什么时候开放升级?华为又食言了,官方宣布延期到六月...
  2. ovirt官方安装文档 第八章
  3. ubuntu中文wiki
  4. Android(Xamarin)之旅(三)
  5. 《Java并发编程的艺术》一一第2章Java并发机制的底层实现原理
  6. ivy maven_将Maven与Ivy集成
  7. python -- join()
  8. Jfinal 文件上传
  9. 高速信号传输约翰逊 pdf_智芯文库 | 高速数字电路的设计与仿真
  10. 【java】监听器的使用
  11. I00001 杨辉三角
  12. HCIE Security PKI 备考笔记(幕布)
  13. opencv python 鼠标响应操作
  14. wextend matlab,小波学习之三(多孔算法与MATLAB swt剖析)转载
  15. Java基于SSH技术的毕业设计管理系统
  16. CASS 10.1.6 安装教程
  17. Linux shell脚本文件的各种执行方式
  18. 计算机导论课程思政,《计算机导论》课程教学中的思政教育.doc
  19. 巴伦变压器的选型和设计
  20. 企业微信三方开发(三):网页授权登录

热门文章

  1. 将 iOS 应用的体积控制在 20MB 以内对于其下载量有很明显的影响吗?
  2. NLB+Cluster(一)
  3. 使用HTML5、CSS3和jQuery增强网站用户体验
  4. 关于wpf,datagrid,双向数据绑定用法解决方案
  5. JS框架_(JQuery.js)纯css3进度条动画
  6. windows编译libevent时报告“缺少print_winsock_errors.obj”的解决
  7. 静态 非静态代码块和构造器的执行顺序测试方法
  8. QM课程02-外部功能
  9. C#实现ByteBuffer类 .
  10. 火狐 增强查找工具栏_在“提示”框中:简单的IE至Firefox同步,轻松的Windows工具栏和识别USB电缆...