前言

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。一个 JWT 实际上就是一个字符串,它由三部分组成,头部、载荷与签名。前两部分需要经过 Base64 编码,后一部分通过前两部分 Base64 编码后再加密而成。针对前后端分离的项目,大多是通过 token 进行身份认证来进行交互,今天将介绍一种简单的创建 和验证token 的方式 。

项目介绍

项目框架:.NET Core 3.1

项目依赖:

  • Swashbuckle.AspNetCore

  • JWT

项目架构:

项目核心代码

JWT帮助类

  /// <summary>
/// JWT获取和验证帮助类
/// </summary>
public class JwtHelper
{
/// <summary>
/// 日志
/// </summary>
private static Logger _logger = new Logger(); /// <summary>
/// 私钥appsettings.json中配置
/// </summary>
private static string secret = ConfigHelper.GetSectionValue("TokenSecret"); /// <summary>
/// 生成JwtToken
/// </summary>
/// <param name="payload">不敏感的用户数据</param>
/// <returns></returns>
public static string SetJwtEncode(Dictionary<string, object> payload)
{
try
{
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);
return token;
}
catch (System.Exception ex)
{
_logger.Error(ex.Message);
return null;
} } /// <summary>
/// 根据jwtToken获取实体
/// </summary>
/// <param name="token">jwtToken</param>
/// <returns></returns>
public static LoginUserInfo GetJwtDecode(string token)
{
try
{
IJsonSerializer serializer = new JsonNetSerializer();
IDateTimeProvider provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtDecoder decoder = new JwtDecoder(serializer, urlEncoder);
//IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
var userInfo = decoder.DecodeToObject<LoginUserInfo>(token, secret, verify: true);//token为之前生成的字符串
return userInfo;
}
catch (System.Exception ex)
{
_logger.Error(ex.Message);
return null;
} } }

过滤器Filter

 /// <summary>
/// 授权认证
/// </summary>
public class AuthorizeFilter : Attribute, IActionFilter
{ public void OnActionExecuted(ActionExecutedContext context)
{ } public void OnActionExecuting(ActionExecutingContext context)
{
var controller = context.RouteData.Values["controller"].ToString();
//var action = context.RouteData.Values["action"].ToString();
if (controller == "User" || controller == "Jwt")
{
//登录接口不验证
}
else
{
var authHeader = context.HttpContext.Request.Headers["Authorization"];
if (string.IsNullOrWhiteSpace(authHeader))
{
//此接口必须携带token访问!
context.Result = new JsonResult(new OperationResult(OperationResultType.Error, "此接口必须携带token访问,请登录携带Token访问"));
}
else //字段值不为空
{
authHeader = authHeader.ToString().Replace("Bearer", "").Trim();//去掉Bearer字串
if (authHeader == "")
{
context.Result = new JsonResult(new OperationResult(OperationResultType.Error, "token验证失败:您没有权限调用此接口,请登录重新获取Token"));
}
else
{
LoginUserInfo LoginInfo = JwtHelper.GetJwtDecode(authHeader);
if (LoginInfo != null)
{
context.Result = new JsonResult(new OperationResult(OperationResultType.Error, "Token验证失败"));
}
string UserName = LoginInfo.username;
string PassWord = LoginInfo.pwd;
string ExpireTimeStamp = LoginInfo.exp;
//var cacheToken = Cache.Get(UserName);
if (isTokenExpire(ExpireTimeStamp)) //这里应该验证有效期
{
context.Result = new JsonResult(new OperationResult(OperationResultType.Error, "token验证失败:您没有权限调用此接口,请登录重新获取Token"));
}
} }
}
} /// <summary>
/// 时间戳字符串
/// </summary>
/// <param name="timestampstr"></param>
/// <returns></returns>
private bool isTokenExpire(string timestampstr)
{
try
{
double timestamp = double.Parse(timestampstr);
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));//当地时区
var expireTime = startTime.AddSeconds(timestamp);
if (expireTime > DateTime.Now)
{
return false;//未过期
}
else
{
return true;//已过期
}
}
catch (Exception ex)
{
return true;
}
} }

测试验证

Swagger页面

登录获取Token

未携带token访问接口

源码获取

关注公众号,后台回复关键字:JwtApiDemo

WebApi中添加Jwt鉴权的更多相关文章

  1. HTTP基本认证和JWT鉴权

    一.HTTP基本认证 Basic Authentication——当浏览器访问使用基本认证的网站的时候, 浏览器会提示你输入用户名和密码. http auth的过程: · 客户端发送http请求 ·  ...

  2. JWT鉴权

    一.HTTP基本认证 Basic Authentication--当浏览器访问使用基本认证的网站的时候, 浏览器会提示你输入用户名和密码. http auth的过程: 客户端发送http请求 服务器发 ...

  3. ASP.NET Core WebAPI中使用JWT Bearer认证和授权

    目录 为什么是 JWT Bearer 什么是 JWT JWT 的优缺点 在 WebAPI 中使用 JWT 认证 刷新 Token 使用授权 简单授权 基于固定角色的授权 基于策略的授权 自定义策略授权 ...

  4. Spring Boot 鉴权之—— JWT 鉴权

    第一:什么是JWT鉴权 1. JWT即JSON Web Tokens,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519),他可以用来安全的传递信息,因为传递的信息是 ...

  5. jwt鉴权学习 (php示例代码)

    前段时间听朋友讲起 jwt鉴权,博主我是一脸懵逼,通过朋友坚持不懈的讲解,我终于听懂了,jwt就是登陆token校验嘛 然而事情并不是博主想象的那么简单,在一个艳阳高照,晴空万里的夜晚,博主手贱百度了 ...

  6. 【十次方微服务后台开发】Day02:加密与JWT鉴权、微服务注册中心、配置中心、熔断器、网关、消息总线、部署与持续集成、容器管理与监控Rancher、influxDB、grafana

    一.密码加密与微服务鉴权JWT 1.BCrypt密码加密 Spring Security 提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用B ...

  7. springboot oauth 鉴权之——password鉴权相当于jwt鉴权模式

    近期一直在研究鉴权方面的各种案例,这几天有空,写一波总结及经验. 第一步:什么是 OAuth鉴权 OAuth2是工业标准的授权协议.OAuth2取代了在2006创建的原始OAuthTM协议所做的工作. ...

  8. ASP.Net WebAPI中添加helppage帮助页面

    一.自动创建带帮助的WebAPI 1.首先创建项目的时候选择WebAPI,如下图所示,生成的项目会自动生成帮助文档. 2.设置调用XML文档的代码 3.设置项目注释XML文档生成目录,项目——属性—— ...

  9. dotnet webapi 中添加Swagger文档

    首先添加"SwaggerGenerator": "1.1.0","SwaggerUi": "1.1.0" 需要注意的是这 ...

  10. 通俗化讲解JWT鉴权的使用场景及结构安全

    一.基于Session的应用开发的缺陷 在我们传统的B\S应用开发方式中,都是使用session进行状态管理的,比如说:保存登录.用户.权限等状态信息.这种方式的原理大致如下: 用户登陆之后,将状态信 ...

随机推荐

  1. linux awk文本

    目录 一.awk概念 二.awk的工作过程 三.awk字符 四.内置变量 五.getline  六.awk的精准筛选 七.例子演示 八.实验演示 一.awk概念 1.概念:awk 是一个功能强大的编辑 ...

  2. [ARM汇编]计算机原理与数制基础—1.1.1计算机的基本原理

    计算机是一种能够根据指令集自动.高速处理数据的现代化设备.它的基本原理可以总结为:输入.存储.处理和输出数据.接下来,我们将详细介绍这些基本原理. 输入 计算机通过输入设备(如键盘.鼠标等)接收外部数 ...

  3. ProtocolBuffers的国际化和本地化支持

    目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 34.< Protocol Buffers 的国际化和本地化支持> 本文将介绍 ...

  4. 机器翻译技术的发展趋势:从API到深度学习

    目录 机器翻译技术的发展趋势:从API到深度学习 随着全球化的发展,机器翻译技术在各个领域得到了广泛的应用.机器翻译技术的核心是将源语言文本翻译成目标语言文本,其中涉及到语言模型.文本生成模型和翻译模 ...

  5. TCP/IP协议发明人G-Cerf

    如果你是一个IT人,你可以不知道Vinton G. Cerf博士,但你不可能不知道TCP/IP; 如果你不是一个IT人,你可以不知道TCP/IP,但你不可能不知道互联网; 如果从1973年起,Vint ...

  6. PowerBuilder从入坑到放弃(二)编码规范

    前言 上一篇我们从0到1用pb开发了一个helloworld程序,并成功将开发的程序编译打包并且制作了安装包. 程序员最讨厌的莫过于写文档和别人不写注释. 不知道大家会不会和我一样,在找bug时,有段 ...

  7. requests高级用法、代理池搭建

    requests高级用法 1.自动携带cookie的session对象 # session对象---->已经模拟登录上了一些网站--->单独把cookie 取出来 import reque ...

  8. Day14_Java_作业

    编程题: 1:获取10个1-20之间的随机数,要求不能重复 答: package StudentWork; import java.util.ArrayList; /** * * 需求: 1:获取10 ...

  9. 【Azure API Management】实现在API Management服务中使用MI(管理标识 Managed Identity)访问启用防火墙的Storage Account

    问题描述 在Azure的同一数据中心,API Management访问启用了防火墙的Storage Account,并且把APIM的公网IP地址设置在白名单.但访问依旧是403 原因是: 存储帐户部署 ...

  10. 平时容易忽视的地方之一:java在抽取方法时,什么时候该用void

    当一个类中多个方法有相同编码,或该部分编码可以作为一个整体,适合抽取出一个方法时,要注意这个抽取的方法的返回值,什么时候可以用void,什么时候不能用void? 先看代码: import lombok ...