Http Only Cookie保护AccessToken

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

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

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

Http Only Cookie

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

aea9cd1b650575167db1a4d47d39999b.png

接下来我们看看在.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即表示客户端脚本不可访问

9aaa4fdcf9ce5b96f89202518c4f61a7.png

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

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

d7d16a93a14086b90a0884f4d0e3f10e.png

用过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

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

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

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

51326519432237c24777b3288cc49685.png

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

f3afa83e5377bebba0cc11a9ce7499b8.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当女朋友生气了而你却没发现 !!!

1 当女朋友生气了而你却没发现。。诶&#xff0c;你咋不吃呢&#xff1f;2 会说话的尾巴。。尾巴&#xff1a;人呢&#xff01;&#xff01;3 小树枝&#xff1a;生命中不能承受之重&#xff01;心疼小树枝&#xff01;4 土耳其冰淇淋小哥终于被反杀了&#xff01;天道好轮…

弱引用什么时候被回收_Java基础 强引用、弱引用、软引用、虚引用

前言在ThreadLocal源码中&#xff0c;其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc。Java中提供这四种引用类型主要有两个目的&#xff1a;第一是可以让程序员通过代码的方式决定某些对象的生命周期&#xff1b;第二是有利于JVM进行垃圾回收。强引用(StrongReference)…

再译《A *路径搜索入门》之四

2019独角兽企业重金招聘Python工程师标准>>> ■在A *方法总结 Summary of the A* Method 好了&#xff0c;现在你通过解释已经走了&#xff0c;让我们奠定了一步一步的方法&#xff0c;在同一个地方&#xff1a; Okay, now that you have gone through the explanat…

记一次 .NET 某电商定向爬虫 内存碎片化分析

一&#xff1a;背景 1. 讲故事上个月有位朋友wx找到我&#xff0c;说他的程序存在内存泄漏问题&#xff0c;寻求如何解决&#xff1f; 如下图所示&#xff1a;从截图中可以看出&#xff0c;这位朋友对 windbg 的操作还是有些熟悉的&#xff0c;可能缺乏一定的实操经验&#xff…

php 合成图片 透明,2020-05-19 php实现透明png多图合成

图片合成的流程一般是&#xff0c;获取图像资源——合成——输出。png图片&#xff0c;一般就用imagecreatefrompng()获取资源。不过这个资源获取后是有白底的。所以需要用imagesavealpha()进行图像处理&#xff0c;得到包含有透明背景的图像。//原始图像$dst "img/1.png…

ArcEngine 没有Esri.ArcGis.GeoAnalyst 命名空间

http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid69977&extrapage%3D1&ordertype1 AE安装的时候分为Core和Extension. Esri.ArcGis.GeoAnalyst位于Extension里面. (1)确保安装的时候是完全安装 (2) 转载于:https://www.cnblogs.com/imihiroblog/archive/2012/04/1…

微信功能“拍一拍”,都有谁在“拍”你?

全世界只有3.14 % 的人关注了爆炸吧知识微信新功能总在悄咪咪更新&#xff0c;“拍一拍”一出&#xff0c;很多小伙伴都会收到各种群里面千奇百怪的“拍一拍”&#xff0c;到底都是谁在偷偷关注你&#xff1f;真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内…

sql 触发器_一键生成某个sql的html--记录执行计划、统计信息、触发器等

概述当你获得某个sql的sql_id时&#xff0c;怎么去一键获得这个sql的一些信息呢&#xff0c;例如列的情况、执行计划等等..脚本有点长&#xff0c;建议大家用电脑来看..下面用一个简单测试来演示下&#xff0c;附脚本领取方式。1、获取sql_idSQL> select a.* from (select S…

别等了,全面「远程办公」凉了

大家好&#xff0c;我是Z哥。这是一篇迟到的文章。具体原因是&#xff0c;昨天定时发送的时候没注意已经过了0点了&#xff0c;习惯性的选了明天11点45&#xff0c;然后才发现实际变成10月9日的11&#xff1a;45了。赶紧取消重新发一下。好了&#xff0c;回到正文。不知道你是否…

PHP做闹钟APP,8款超好用的闹钟APP,专治各种赖床

这是什么神仙APP&#xff0c;我再也不怕冬天起不了床&#xff01;有了它们&#xff0c;再也不怕懒床迟到了&#xff01;好用到爆&#xff01;可爱女生闹钟(超可爱的用户界面)这界面真是太可爱了&#xff0c;软萌妹子必备啊。推荐指数&#xff1a;★★★★怪物闹钟(玩游戏才能关…

easy html5 - Jquery mobile

今天看了下jquery mobile(http://jquerymobile.com/)&#xff0c;看了后自己很兴奋&#xff1b;jquery 在web js框架上的风暴还在继续却也随着移动终端走向了mobile&#xff1b;那么jquery mobile到底包括些什么呢 首先jquery mobile是基于html5的&#xff0c;因为html5已经被默…

太漂亮了!66个高颜值的矿物晶体,吸引到你的目光了吗

全世界只有3.14 % 的人关注了爆炸吧知识1“中国皇帝”菱锰矿“中国皇帝”产自广西梧州&#xff0c;最大晶体为22厘米&#xff0c;是目前中国发现的菱锰矿中体积最大、单晶最大、质量最好的一件标本&#xff0c;在世界范围内亦属罕见。2车轮矿晶簇世界罕见的车轮矿晶簇。3祖母绿…

oracle中sum和count可以嵌套吗_【分享吧】Oracle查询转换

前言“查询转换”是Oracle解析SQL语句中重要的步骤。其原理是Oracle在解析时通过对原有SQL的等价改写&#xff0c;以达到较高执行效率的方式。上图展示了SQL的执行过程&#xff0c;当客户提交的语句经过解析后&#xff0c;在提交给优化器之前会进行一个查询转换的步骤。在这个步…

如何正确地部署防火墙?

防火墙在实际的部署应用过程当中&#xff0c;经常部署在网关的位置&#xff0c;也就是经常部署在网内和网外的一个"中间分隔点"上&#xff0c;而就是在这样一个部署的环境中&#xff0c;也还存在着多种方式&#xff0c;且存在着许多"陷阱"&#xff0c;本文…

男人是大猪蹄子的证据找到了!

1 老师&#xff01;2 您倒也不必如此诚实3 哈哈哈哈哈哈这也太显眼了4 圆的面积其实可以这样算5 喵&#xff1a;进不去......好烦&#xff01;&#xff01;6 狗子&#xff1a;好好扔&#xff0c;砸我干嘛&#xff1f;你到底会不会玩&#xff1f;&#xff01;7 男人是大猪蹄子的…

set-cookie 和 cookie 的区别_Go Web 编程如何确保Cookie数据的安全传输

什么是CookieCookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据&#xff0c;它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常&#xff0c;它用于告知服务端两个请求是否来自同一浏览器&#xff0c;如保持用户的登…

使用C#快速生成顺序GUID

前言通常&#xff0c;我们采用数值ID(long)/GUID作为全局唯一标识符。但是&#xff0c;在多线程、高并发情况下&#xff0c;由应用程序生成数值ID容易产生重复&#xff0c;而由数据库生成又会造成性能瓶颈。而使用Guid.NewGuid()生成的GUID虽然不会重复&#xff0c;但是它是无序…

带你见识世界的5部纪录片(免费领取)

全世界只有3.14 % 的人关注了爆炸吧知识纪录片一直都是增长见识又带给你力量的东西&#xff0c;你可能忙于学业、生活、工作而不能行万里路&#xff0c;但至少你还可以看纪录片&#xff0c;从一方屏幕看到整个世界。今天就为大家整理了5部高分纪录片&#xff0c;文末附领取方式…

Android简明开发教程二十一:访问Internet 绘制在线地图

在例子Android简明开发教程十七&#xff1a;Dialog 显示图像 中我们留了一个例子DrawMap()没有实现&#xff0c;这个例子显示在线地图&#xff0c;目前大部分地图服务器都是将地图以图片存储以提高响应速度。 一般大小为256X256个像素。具体可以参见离线地图下载方法解析 。 比…

url采集工具_大数据关键技术浅谈之大数据采集

在前几篇文章中&#xff0c;企通查为大家介绍了大数据处理的基本流程。从大数据的一系列处理过程中&#xff08;抽取、集成、分析、解释&#xff09;&#xff0c;我们可以发现这一整套流程中涵盖了数据存储、处理、应用等多方面的技术。大数据价值的完美体现需要多种技术的协同…