JWT学习文章:

第一篇:JWT原理

第二篇:JWT原理实现代码

第三篇:在asp.net core中的使用JWT

前两篇文章中我写了jwt的原理,并且也用原理实现了jwt的验证。如果要看前两篇文章,点击上面的连接就能够链接过去。

第二篇文章实现jwt原理时有同学就说每个成熟的框架中都有相应的jwt实现或集成。说的不错,每个主流的框架中几乎毫无例外的都集成了jwt的实现,但是我们上篇文章的重点是希望大家能够明白原理,和这些框架中实现的基本思路,如无特殊情况也没有必要自己来写。

那么这篇文章我们就来看看asp.net core中jwt如何使用!

注意,本文主要是代码,必要的文字说明我已经都在代码注释中写出来了。文末我会给出源码地址。


新建一个空的asp.net core项目:

新建一个类Const放置一些常量:

  1. public class Const
  2.  
  3. {
  4.  
  5. public const string SecurityKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSfLGu+kcFDcJUCV46J+SbgR0lNc2NqgCGzojQTWW9xqjuzPF3mpisvTggYZSGfBzN+88YLZYbBLrDTUMJ4nTieElbP6SHkBFu8F+7fFBi7w3UPsaAXDr2E2srQYU5ZlKAcFBoNajNWj3sfSVRoYRPdqDTj4WdJlUPSNGz0wgRrQIDAQAB";
  6.  
  7. public const string Domain = "http://localhost:5000";
  8.  
  9. }

在Startup中向应用添加jwt验证服务:

  1. //添加jwt验证:
  2.  
  3. services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  4.  
  5. .AddJwtBearer(options => {
  6.  
  7. options.TokenValidationParameters = new TokenValidationParameters
  8.  
  9. {
  10.  
  11. ValidateIssuer = true,//是否验证Issuer
  12.  
  13. ValidateAudience = true,//是否验证Audience
  14.  
  15. ValidateLifetime = true,//是否验证失效时间
  16.  
  17. ClockSkew = TimeSpan.FromSeconds(30),
  18.  
  19. ValidateIssuerSigningKey = true,//是否验证SecurityKey
  20.  
  21. ValidAudience = Const.Domain,//Audience
  22.  
  23. ValidIssuer = Const.Domain,//Issuer,这两项和前面签发jwt的设置一致
  24.  
  25. IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Const.SecurityKey))//拿到SecurityKey
  26.  
  27. };
  28.  
  29. });

管道中添加jwt验证:

  1. //添加jwt验证
  2.  
  3. app.UseAuthentication();

由于管道有执行顺序的特性,因此最好放在管道的开始位置。

添加登录获取token的接口:

  1. [ApiController]
  2.  
  3. [Route("[controller]")]
  4.  
  5. public class AuthController : ControllerBase
  6.  
  7. {
  8.  
  9. [AllowAnonymous]//指定此属性应用于的类或方法不需要授权。
  10.  
  11. [HttpGet]
  12.  
  13. public IActionResult Get(string userName, string pwd)
  14.  
  15. {
  16.  
  17. if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(pwd))
  18.  
  19. {
  20.  
  21. var claims = new[]
  22.  
  23. {
  24.  
  25. new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") ,
  26.  
  27. new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddMinutes(30)).ToUnixTimeSeconds()}"),
  28.  
  29. new Claim(ClaimTypes.Name, userName)
  30.  
  31. };
  32.  
  33. var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Const.SecurityKey));
  34.  
  35. var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  36.  
  37. var token = new JwtSecurityToken(
  38.  
  39. issuer: Const.Domain,
  40.  
  41. audience: Const.Domain,
  42.  
  43. claims: claims,
  44.  
  45. expires: DateTime.Now.AddMinutes(30),
  46.  
  47. signingCredentials: creds);
  48.  
  49. return Ok(new
  50.  
  51. {
  52.  
  53. token = new JwtSecurityTokenHandler().WriteToken(token)
  54.  
  55. });
  56.  
  57. }
  58.  
  59. else
  60.  
  61. {
  62.  
  63. return BadRequest(new { message = "username or password is incorrect." });
  64.  
  65. }
  66.  
  67. }
  68.  
  69. }

方法中对用户名和密码的验证只是简单的验空,实际应用中会更复杂,也会与数据库中的数据比对。

接下来就是对jwt的应用了。

新建HomeController,用于验证jwt是否成功启用:

  1. [ApiController]
  2.  
  3. [Route("[controller]")]
  4.  
  5. public class HomeController : ControllerBase
  6.  
  7. {
  8.  
  9. [HttpGet]
  10.  
  11. [Route("api/value1")]
  12.  
  13. public ActionResult<IEnumerable<string>> Get()
  14.  
  15. {
  16.  
  17. return new string[] { "value1", "value1" };
  18.  
  19. }
  20.  
  21. [HttpGet]
  22.  
  23. [Route("api/value2")]
  24.  
  25. [Authorize]
  26.  
  27. public ActionResult<IEnumerable<string>> Get2()
  28.  
  29. {
  30.  
  31. return new string[] { "value2", "value2" };
  32.  
  33. }
  34.  
  35. }

其中Get()方法不需要验证,Get2()需要验证。

测试:

先测试Get()方法(接口名称时api/value1),因为此方法不用验证:

验证成功!!!

接下来测试Get2():

访问Get2()方法的接口名api/value2,粘贴上面获得的token到header中:

验证成功!!!

总结:至此,使用asp.net core 自带的jwt方法就完成了。

源码地址:https://gitee.com/jingboweilanGO/Demo_jwt_core.git

说明:Demo-jwt-core是本篇文章涉及到的源码,是使用asp.net core 自带的jwt方法;

     Demo-jwt-core2是上一篇文章的源码,根据jwt原理实现的代码。

jwt-在asp.net core中的使用jwt的更多相关文章

  1. 如何简单的在 ASP.NET Core 中集成 JWT 认证?

    前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...

  2. ASP.NET Core 中jwt授权认证的流程原理

    目录 1,快速实现授权验证 1.1 添加 JWT 服务配置 1.2 颁发 Token 1.3 添加 API访问 2,探究授权认证中间件 2.1 实现 Token 解析 2.2 实现校验认证 1,快速实 ...

  3. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  4. [转]ASP.NET Core 中的那些认证中间件及一些重要知识点

    本文转自:http://www.qingruanit.net/c_all/article_6645.html 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系 ...

  5. 在ASP.NET Core中使用Angular2,以及与Angular2的Token base身份认证

    注:下载本文提到的完整代码示例请访问:How to authorization Angular 2 app with asp.net core web api 在ASP.NET Core中使用Angu ...

  6. 在ASP.NET Core中实现一个Token base的身份认证

    注:本文提到的代码示例下载地址> How to achieve a bearer token authentication and authorization in ASP.NET Core 在 ...

  7. ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露

    一.前言 在涉及到后端项目的开发中,如何实现对于用户权限的管控是需要我们首先考虑的,在实际开发过程中,我们可能会运用一些已经成熟的解决方案帮助我们实现这一功能,而在 Grapefruit.VuCore ...

  8. ASP.NET Core 中的实时框架 SingalR

    目录 SignalR 是什么? 在 ASP.NET Core 中使用 SignalR 权限验证 横向扩展 源代码 参考 SignalR 是什么? ASP.NET Core SignalR 是一个开源的 ...

  9. ASP.NET Core 3.0 一个 jwt 的轻量角色/用户、单个API控制的授权认证库

    目录 说明 一.定义角色.API.用户 二.添加自定义事件 三.注入授权服务和中间件 三.如何设置API的授权 四.添加登录颁发 Token 五.部分说明 六.验证 说明 ASP.NET Core 3 ...

随机推荐

  1. .Net Core——用代码写代码?

    想要用代码写代码,肯定是绕不开反射的.反射的概念相比都不陌生,只是应用多少就因人而异,今天分享一个代码生成器的思路,仅供参考,不要过分依赖哦. 思路分析 众所周知,利用反射可以在程序运行时获取到任一对 ...

  2. Linux 操作系统(一)命令&用户&权限

    以下实例均在Centos7下验证 Centos7 查看命令帮助 man xxx 常用命令 ls / cd - #切到上次目录 cd #回家 cat cat f1 f2 cat f1 f2>f3 ...

  3. 使用 dd 命令进行硬盘 I/O 性能检测

    使用 dd 命令进行硬盘 I/O 性能检测 作者: Vivek Gite 译者: LCTT DongShuaike | 2015-08-28 07:30   评论: 1 收藏: 6 如何使用dd命令测 ...

  4. 最简单的方法是使用标准的 Linux GUI 程序之一: i-nex 收集硬件信息,并且类似于 Windows 下流行的 CPU-Z 的显示。 HardInfo 显示硬件具体信息,甚至包括一组八个的流行的性能基准程序,你可以用它们评估你的系统性能。 KInfoCenter 和 Lshw 也能够显示硬件的详细信息,并且可以从许多软件仓库中获取。

    最简单的方法是使用标准的 Linux GUI 程序之一: i-nex 收集硬件信息,并且类似于 Windows 下流行的 CPU-Z 的显示. HardInfo 显示硬件具体信息,甚至包括一组八个的流 ...

  5. jmeter while控制器踩坑

    在使用jmeter测试一个复杂流程,需要用到while控制器,对于里面的contition,使用jexl3方式,怎么看都没有问题,可是死活跳不出流程,各种莫名其妙的报错,甚至用单个写死的变量(已设置为 ...

  6. mysql简单教程-(转自wid)

    21分钟 MySQL 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数 ...

  7. Jaxb的优点与用法(bean转xml的插件,简化webservice接口的开发工作量)

    一.jaxb是什么 JAXB是Java Architecture for XML Binding的缩写.可以将一个Java对象转变成为XML格式,反之亦然.     我们把对象与关系数据库之间的映射称 ...

  8. python实现给字典添加条目的方法

    具体实现方法如下: def addWord(theIndex,word,pagenumber): theIndex.setdefault(word, [ ]).append(pagenumber)#存 ...

  9. pika详解(三)SelectConnection及其他Connection

    pika详解(三)SelectConnection及其他Connection   本文链接:https://blog.csdn.net/comprel/article/details/94661147 ...

  10. 使用Jprofiler分析Java项目的内存开销情况并利用强制回收控制内存

    一.问题背景 自己开发的Java项目中占用太多的Heap Space.即使在Eclipse的虚拟机参数中设置"-Xms128m -Xms2048m -XX:MetaspaceSize=512 ...