Web API与JWT认证
JWT(Json Web Token)定义了一种使用Json形式在网络间安全地传递信息的简洁开放的标准(RFC 7519)。JWT使用数字签名确保信息是可信的。
一、Session认证和Token认证
Http协议本身是无状态的,如果用户向服务器传递了用户名和密码进行了用户认证,那么下一次请求时用户还是需要进行同样的认证,因为根据Http协议,我们无法知道请求是由哪个用户发出的。所以,为了能识别哪个用户,免去每次都进行验证的麻烦,就有了传统的Session认证和token认证方案。
a) Session认证
Session认证的方案为:第一次用户认证请求通过时,服务器端存储用户的登录信息,然后在响应时传递给浏览器,浏览器保存为cookie,下次请求时把cookie发送给服务器,服务器根据cookie信息来识别是哪个用户。
Session认证适用于单个服务器的场合,如果用户增多,需要部署多个服务器时,Session认证就会暴露问题。因为每个用户在认证后,服务器都会记录Session,一般保存在内存中,随着认证用户增多,服务器开销也会增大;而且认证用户的后续请求都需要到这台保存了自己Session的服务器上验证Cookie。在多集群分布式的场合,这就造成了性能瓶颈,对负载均衡、应用的扩展都会造成影响。
进程外Session通过将Session保存在数据库或硬盘中可以解决服务器内存开销的问题,但仍然不便于扩展。
b) Token认证
Token认证也是无状态的,不需要在服务端保存认证用户的信息,它的认证流程为:用户使用用户名密码请求服务器;服务器验证用户,如果验证通过就发给用户一个token;客户端保存token,并在之后的每次请求都附上token;服务端验证token、返回数据。
Token认证机制不需要保存认证用户的信息、也不需要考录用户在那台服务器登录,可以很好地适应应用的扩展。
token的体积很小,请求服务端时,可以被附在URL、Header或是Post参数中。而且token中包含了用户相关的必要、非私密的相信,免去了服务端再次查询数据库的开销。
c) JWT的使用场景
最常用于对已经登录用户的认证,比如单点登录,只需在每次请求中都附上JWT,JWT体积小巧且支持跨域、多语言。
JWT也可以用于信息传输,因为有根据payload和header计算出的签名的保护,可以确保传递的信息不被篡改。
三、JWT的构成
JWT由Header、Payload、Signature三部分构成,之间用点号风格,构成xx.yy.zz的形式。
a) Header声明了token类型、算法类型(HMAC SHA256或RSA),比如
{
"alg": "HS256",
"typ": "JWT"
}
然后对header做Base64URL编码。
b) Payload中保存了声明信息,声明信息有标准声明、公开声明、自定义声明三种类型,前两种声明在相关的标准中已经规定https://www.iana.org/assignments/jwt/jwt.xhtml,推荐但不强制使用,标准声明举例有:
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
发送方和接收方也可以自定声明。
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
载荷信息也使用Base64URL编码。
c) Signature,签证信息是根据Header、Payload的Base64URL编码以及密钥(Secret)加密生成的,加密算法使用header中定义的类型。
d) Secret信息只保存在服务端,服务端为客户端签发jwt token要使用Secret,后续对客户端递交的jwt的验证也要使用Secret,所以一定要防止Secret的泄露。
四、JWT的使用
var secret = "h3h5k9kll789";
//JWT签发
var payload = new Dictionary<string, object>
{
{ "UserID",123},
{"UserName","admin" }
};
//指定HMAC加密算法
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
IJsonSerializer serializer = new JsonNetSerializer();
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
var token = encoder.Encode(payload, secret);//JWT验证及解析
IJsonSerializer serializer1 = new JsonNetSerializer();
IDateTimeProvider provider1 = new UtcDateTimeProvider();
IJwtValidator validator1 = new JwtValidator(serializer1, provider1);
IBase64UrlEncoder urlEncoder1 = new JwtBase64UrlEncoder();
IJwtDecoder decoder = new JwtDecoder(serializer1, validator1, urlEncoder1);
//解析出PayLoad
var json = decoder.Decode(token, secret, verify: true);
学习资料:如鹏网.net提高班http://www.rupeng.com/News/10/4603.shtml
http://www.jianshu.com/p/576dbf44b2ae
https://jwt.io/
Web API与JWT认证的更多相关文章
- asp.net core 2.0 web api基于JWT自定义策略授权
JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端 ...
- ASP.NET Core Web Api之JWT(一)
前言 最近沉寂了一段,主要是上半年相当于休息和调整了一段时间,接下来我将开始陆续学习一些新的技术,比如Docker.Jenkins等,都会以生活实例从零开始讲解起,到时一并和大家分享和交流.接下来几节 ...
- ASP.NET Core Web Api之JWT VS Session VS Cookie(二)
前言 本文我们来探讨下JWT VS Session的问题,这个问题本没有过多的去思考,看到评论讨论太激烈,就花了一点时间去研究和总结,顺便说一句,这就是写博客的好处,一篇博客写出有的可能是经验积累,有 ...
- Web Api 2 用户认证模板解析-----外部用户认证模式
一般的社交提供商不提供一个Web Service进行身份验证(有很好的理由),而提供一个身份验证的界面,其中包含了某种协议如OpenID(连接)或使用OAuth2认证.这意味着客户端应用必须使用一个浏 ...
- web api 的 安全 认证问题 , 对外开放 的 时候 需要考虑到安全的问题
关于 OWIN OAuth , web api的认证,全局验证, 安全方面的验证 有必要 去 自己捣鼓一下.
- ASP.NET Core Web Api之JWT刷新Token(三)
前言 如题,本节我们进入JWT最后一节内容,JWT本质上就是从身份认证服务器获取访问令牌,继而对于用户后续可访问受保护资源,但是关键问题是:访问令牌的生命周期到底设置成多久呢?见过一些使用JWT的童鞋 ...
- ASP.NET Web API 2 使用 DelegatingHandler(委托处理程序)实现签名认证
Ø 前言 在前一篇ASP.NET Web API 2 使用 AuthorizationFilter(授权过滤器)实现 Basic 认证文章中实现了采用 Basic 认证的方式,但是这种方式存在安全隐 ...
- Asp.net MVC使用FormsAuthentication,MVC和WEB API可以共享身份认证 (转载)
在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...
- 使用JWT创建安全的ASP.NET Core Web API
在本文中,你将学习如何在ASP.NET Core Web API中使用JWT身份验证.我将在编写代码时逐步简化.我们将构建两个终结点,一个用于客户登录,另一个用于获取客户订单.这些api将连接到在本地 ...
随机推荐
- 理解Docker
Docker Image OS分为 内核(kernel) 和 用户 空间,kernel 启动后,会挂载root文件系统提供用户空间. Docker Image 就相当于一个 root文件系统.是一个特 ...
- 卖给高通之后的CSR的现状和未来
转眼之间,CSR已经嫁给高通两年了,养在深宫大院大小妾的CSR,到底过的怎么样呢? 从高通官网上查看的结果显示,CSR产品被分成了三类: A 传统的用在耳机音响的CSR86XX系列,这部分改动不大,就 ...
- Docker - 配置DaoCloud的Docker加速器
由于众所周知的原因,从Docker Hub难以高效地下载镜像. 除了使用VPN或代理之外,最为有效的方式就是使用Docker国内镜像. DaoCloud是首个提供国内免费Docker Hub镜像的团体 ...
- spring boot 集成jsp
刚开始操作的时候,遇到了个问题,在这记录一下.(因为自己是个新手,对maven项目结构不了解) 1.大概创建步骤如下 File-New-Project-Spring Initializr ,type选 ...
- Asp.Net Core 发布异常 502.5 [The Application process failed to Start]
出现这个问题大部分时间都是因为发布时,少打包了一些文件.. 只打包了.Net Core的运行时库,没有打包Asp.Net Core 运行时.. 需要在打包指导文件中加入以下节点 <Propert ...
- Neo4j使用Cypher查询图形数据
Neo4j使用Cypher查询图形数据,Cypher是描述性的图形查询语言,语法简单,功能强大,由于Neo4j在图形数据库家族中处于绝对领先的地位,拥有众多的用户基数,使得Cypher成为图形查询语言 ...
- css属性书写顺序分析
我们直接从例子出发 @font-face { font-family: 'icomoon'; src: url('fonts/icomoon.eot?speta9'); src: url('fonts ...
- spring framework核心框架体系结构(转载)
作者:Dreawer 很多人都在用spring开发java项目,但是配置maven依赖的时候并不能明确要配置哪些spring的jar,经常是胡乱添加一堆,编译或运行报错就继续配置jar依赖,导致spr ...
- 从零开始学 Web 之 DOM(三)innerText与innerHTML、自定义属性
大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...
- 只知道ajax?你已经out了
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 随着前端技术的发展,请求服务器数据的方法早已不局限于ajax.jQuery的ajax方法.各种js库已如雨 ...