.Net 使用JWT
JWT
- 什么是JSON Web Token?
SON Web Token(以下简称 JWT)是一套开放的标准(RFC 7519),它定义了一套简洁(compact)且 URL 安全(URL-safe)的方案,以安全地在客户端和服务器之间传输 JSON 格式的信息。
- 它有什么优点?
- 体积小(一串字符串)。因而传输速度快
- 传输方式多样。可以通过 HTTP 头部(推荐)/URL/POST 参数等方式传输
- 严谨的结构化。它自身(在 payload 中)就包含了所有与用户相关的验证消息,如用户可访问路由、访问有效期等信息,服务器无需再去连接数据库验证信息的有效性,并且 payload 支持应用定制
- 支持跨域验证,多应用于单点登录
- 为什么使用JWT?
充分依赖无状态 API ,契合 RESTful 设计原则(无状态的 HTTP)
JWT的Token组成部分
- header:对token的类型以及加密方法进行base64加密得到;
- payload:对有效信息进行base64加密得到;
- signature:对base64加密后的header和base64加密后的payload使用’.’组合为字符串,再通过header中指定的加密方式加secret组合加密;
他是怎么鉴别客户端传来的tojen是否被篡改的?
在我们收到客户端的token后,将token的第一和第二部分,再次进行组合加密第三部分的过程,得到一个signature。如果这个singature和token里的singnature对比不同,则token被篡改。
因此我们服务器端必须保留secret且不能泄露,否则客户端可以自行签发。
如何使用JWT
- 加密
- 引入JWT程序包
- 生成token
1 | c#复制代码 private static string Secret = "serect"; |
1 | c#复制代码 private static string Secret = "serect"; |
WebApi中使用JWT进行身份验证
- 发起登录请求,并传递参数
- 接收参数,验证登录逻辑,登陆成功则返回token
- 客户端接受,保存token,请求权限api,并将token附加在header头
- 服务器验证身份,如果token不存在或token被篡改,验证失败,没有权限获得数据
- 未使用过滤器的身份验证,略显代码冗余
1 | c#复制代码 public class JwtTools |
1 | c#复制代码 [HttpPost] |
使用这种方法可以实现身份验证,但是如果每个Action都需要通过身份验证,我们岂不是需要在每一个Action中都写一次调用。显然很麻烦。
因此我们有第二种方法,
过滤器
,当每一次请求到达时,都将先执行过滤器的方法,如果通过则将执行Action。符合asp.net管道事件。
- 过滤器
- 1.使用过滤器对JWT进行验证
- 2.将验证过后得到的结果赋给User.Identity……
- 3.因为User和Identity是接口类型,因此我们可以实现这些接口,并在过滤器中赋值给User和Identity
过滤器
1 | c#复制代码public class MyAuth : Attribute, IAuthorizationFilter |
实现User和Identity
1 | c#复制代码public class AppUser : IPrincipal |
JWTTools
1 | c#复制代码public class JwtTools |
- WebApi支持数据注解
本文转载自: 掘金