jwt token 附加用户信息_ASP.NET Web API 2系列(四):基于JWT的token身份认证方案

本文介绍了如何在ASP.NET Web API 2中实现基于JWT的token身份认证方案。通过JWT,客户端获取并携带token进行请求,服务器验证token以确保安全性。文章详细讲解了JWT的工作流程、结构,以及如何通过代码实现登录验证、JWT生成和API授权过滤器。
摘要由CSDN通过智能技术生成

1.引言

通过前边的系列教程,我们可以掌握WebAPI的初步运用,但是此时的API接口任何人都可以访问,这显然不是我们想要的,这时就需要控制对它的访问,也就是WebAPI的权限验证。验证方式非常多,本文就重点介绍一种常用的验证方式:基于JWT的token身份认证方案。

2.前期回顾

Web API系列(一):初识API及手动搭建基本框架

Web API系列(二):灵活多样的路由配置

Web API系列(三):添加接口详细说明及测试

3.认识JWT

JWT是 JSON Web Token 的缩写,是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

3.1 JWT工作流程

这里我们通过一张图了解它的工作流程。

从上图中我们可以看出它是基于Token的身份认证,具体流程:客户端携带用户名和密码请求访问 - 服务器校验用户凭据 - 应用提供一个token给客户端 - 客户端存储token,并且在随后的每一次请求中都带着它 -服务器校验token并返回数据。

3.2JWT结构

JSON Web Token由三部分组成,它们之间用圆点(.)连接。这三部分分别是:

Header:头部,它有token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)两部分组成;

Payload:荷载,它包含声明(要求)。声明是关于实体(通常是用户)和其他数据的声明;

Signature:签名,目的是用来验证头部和载荷是否被非法篡改。

通过下图,我们可以直观的看到JWT的组成。

它本质上是一个独立的身份验证令牌,可以包含用户标识、用户角色和权限等信息,以及您可以存储任何其他信息(自包含)。任何人都可以轻松读取和解析,并使用密钥来验证真实性。

4.具体实现

上文介绍了JWT的原理,读者简单了解即可,这里我们通过具体代码来实现。

4.1安装JWT包

通过NuGget管理工具安装JWT包,如下图

4.2添加LoginRequest、AuthInfo和HttpResult三个实体类

在MyWebAPI.Entities中添加相应类

LoginRequest实体

public class LoginRequest{ public string UserId { get; set; } public string Password { get; set; }}

AuthInfo实体类

public class AuthInfo{ public string UserId { get; set; } public DateTime Expires { get; set; }}

HttpResul实体类

public class HttpResult{ public bool Success { get; set; } public dynamic Data { get; set; } public string Message { get; set; }}

4.3添加SystemController,并添加Login登录方法

具体代码如下:

[RoutePrefix("api/System")]public class SystemController : ApiController{ [HttpPost, Route("Login")] public HttpResult Login([FromBody] LoginRequest loginRequest) { if (loginRequest == null) return new HttpResult() { Success = false, Message = "登录信息为空!" }; #region 通过数据库判断登录信息是否正确(这里简化判断) if (loginRequest.UserId != "admin" || loginRequest.Password != "admin") { return new HttpResult() { Success = false, Message = "用户名和密码不正确!" }; } #endregion AuthInfo authInfo = new AuthInfo() { UserId = loginRequest.UserId, Expires = DateTime.Now.AddDays(1) }; const string secretKey = "matanzhang";//口令加密秘钥(应该写到配置文件中) byte[] key = Encoding.UTF8.GetBytes(secretKey); IJwtAlgorithm algorithm = new HMACSHA256Algorithm();//加密方式 IJsonSerializer serializer = new JsonNetSerializer();//序列化Json IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();//base64加解密 IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);//JWT编码 var token = encoder.Encode(authInfo, key);//生成令牌 return new HttpResult() { Success = true, Data = token,Message = "登录成功!"}; }}

4.4添加API过滤器ApiAuthorizeAttribute

具体代码如下:

public class ApiAuthorizeAttribute: AuthorizeAttribute{ protected override bool IsAuthorized(HttpActionContext actionContext) { try { var authHeader = from t in actionContext.Request.Headers where t.Key == "auth" select t.Value.FirstOrDefault(); var enumerable = authHeader as string[] ?? authHeader.ToArray(); string token = enumerable.FirstOrDefault(); if (string.IsNullOrEmpty(enumerable.FirstOrDefault())) return fals.........

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值