JWT学习文章:

第一篇:JWT原理

第二篇:JWT原理实现代码

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

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

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

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

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


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

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

public class Const

{

    public const string SecurityKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSfLGu+kcFDcJUCV46J+SbgR0lNc2NqgCGzojQTWW9xqjuzPF3mpisvTggYZSGfBzN+88YLZYbBLrDTUMJ4nTieElbP6SHkBFu8F+7fFBi7w3UPsaAXDr2E2srQYU5ZlKAcFBoNajNWj3sfSVRoYRPdqDTj4WdJlUPSNGz0wgRrQIDAQAB";

    public const string Domain = "http://localhost:5000";

}

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

//添加jwt验证:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)

    .AddJwtBearer(options => {

        options.TokenValidationParameters = new TokenValidationParameters

        {

            ValidateIssuer = true,//是否验证Issuer

                        ValidateAudience = true,//是否验证Audience

                        ValidateLifetime = true,//是否验证失效时间

                        ClockSkew = TimeSpan.FromSeconds(30),

            ValidateIssuerSigningKey = true,//是否验证SecurityKey

                        ValidAudience = Const.Domain,//Audience

                        ValidIssuer = Const.Domain,//Issuer,这两项和前面签发jwt的设置一致

                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Const.SecurityKey))//拿到SecurityKey

                    };

    });

管道中添加jwt验证:

//添加jwt验证

app.UseAuthentication();

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

添加登录获取token的接口:

[ApiController]

[Route("[controller]")]

public class AuthController : ControllerBase

{

    [AllowAnonymous]//指定此属性应用于的类或方法不需要授权。

    [HttpGet]

    public IActionResult Get(string userName, string pwd)

    {

        if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(pwd))

        {

            var claims = new[]

            {

                    new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") ,

                    new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddMinutes(30)).ToUnixTimeSeconds()}"),

                    new Claim(ClaimTypes.Name, userName)

                };

            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Const.SecurityKey));

            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            var token = new JwtSecurityToken(

                issuer: Const.Domain,

                audience: Const.Domain,

                claims: claims,

                expires: DateTime.Now.AddMinutes(30),

                signingCredentials: creds);

            return Ok(new

            {

                token = new JwtSecurityTokenHandler().WriteToken(token)

            });

        }

        else

        {

            return BadRequest(new { message = "username or password is incorrect." });

        }

    }

}

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

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

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

[ApiController]

[Route("[controller]")]

public class HomeController : ControllerBase

{

    [HttpGet]

    [Route("api/value1")]

    public ActionResult<IEnumerable<string>> Get()

    {

        return new string[] { "value1", "value1" };

    }

    [HttpGet]

    [Route("api/value2")]

    [Authorize]

    public ActionResult<IEnumerable<string>> Get2()

    {

        return new string[] { "value2", "value2" };

    }

}

其中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. JAVA并发(2)-ReentrantLock的见解

    上节,我们讲了AQS的阻塞与释放实现原理,线程间通信(Condition)的原理.这次,我们就讲讲基于AQS实现的ReentrantLock(重入锁). 1. 介绍 结合上面的ReentrantLoc ...

  2. Aliyun SSL 证书签发&安装

    目录 HTTPS SSL证书 签发 和 应用 证书购买 证书申请 证书安装 参考文档 HTTPS SSL证书 签发 和 应用 - SSL证书服务(Alibaba Cloud SSL Certifica ...

  3. CentOS 8.2远程连接vncserver升级后1.10.1无法启动解决记录

    CentOS 8.2远程连接vncserver升级后1.10.1无法启动解决记录   问题起源:手贱yum upgrade,重启服务器后无法使用vnc viewer远程连接 查看状态 # system ...

  4. 一、python入门练习题

    题目: 练习1:华氏温度转摄氏温度. 练习2:输入圆的半径计算计算周长和面积. 练习3:输入年份判断是不是闰年. 答案: 练习1: """ 将华氏温度转换为摄氏温度 F ...

  5. Canal和Otter讨论二(原理与实践)

    上次留下的问题 问题一: 跨公网部署Otter 参考架构图 解析 ​ a. 数据涉及网络传输,S/E/T/L几个阶段会分散在2个或者更多Node节点上,多个Node之间通过zookeeper进行协同工 ...

  6. Python re 截取文本中IP地址及用户名

    文本示例: ts=2019-07-10T06:43:06523942Z pid=1875 tid=6320 version=e73c536 proto=http id=5a61a613e395f883 ...

  7. Linux_配置辅助DNS服务(基础)

    [RHEL8]-DNSserver1:[RHEL7]-DNSserver2:[Centos7]-DNSclient !!!测试环境我们首关闭防火墙和selinux(DNSserver1.DNSserv ...

  8. STM32 串口接收大量数据导致死机

    http://blog.csdn.net/origin333/article/details/49992383 以下文章出自上面的链接.感谢原创作者的分享. 在一项目中,使用STM32作为主控,程序运 ...

  9. redis中AOF和RDB的关闭方法

    redis中AOF和RDB的关闭方法   问题:当往redis中导入数据时,有时会出现redis server went away的情况: 原因: 导入的数据量太大,而内存不够(即内存1G,但数据有2 ...

  10. Manjaro Linux安装singularity-container

    技术背景 容器化技术在各种生产领域已经得到了广泛的应用,这得益于容器的轻量化(相比于虚拟机而言),安全性(隔离弱于虚拟机,但是权限控制得当的情况下也可以认为是安全隔离的)以及系统级虚拟化带来的高可用性 ...