一、什么是JWT

文章参考:https://www.leo96.com/article/detail/55

JSON Web令牌(JWT)是一个开放标准(RFC 7519),它定义 了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对JWT进行签名。

二、使用场景

1、授权:这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。单一登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。

2、信息交换:JSON Web令牌是在各方之间安全传输信息的好方法。因为可以对JWT进行签名(例如,使用公钥/私钥对),所以您可以确定发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否未被篡改。

三、JWT授权流程

四、JWT令牌结构

1、header(头部)头部是令牌的第一部分,通常由两部分组成:令牌的类型(即JWT)和令牌所使用的签名算法,如SHA256、HMAC等

2、payload(有效载荷)头部是令牌的第一部分,通常由两部分组成:令牌的类型(即JWT)和令牌所使用的签名算法,如SHA256、HMAC等

有三种说明类型,预定义声明、公共声明和私有声明。声明名称仅是三个字符,因为JWT是紧凑的

  • 预定义声明:包括iss(发出者), exp(到期时间), sub(主题), aud(受众)等,是推荐的但是不是强制的可以没有。
  • 公共声明:公共声明,这个部分可以随便定义,但是要注意和 IANA JSON Web Token 冲突。
  • 私有声明:这个部分是共享被认定信息中自定义部分。

3、signature(签名)  签名是令牌的第三部分,由header和payload进行64位编码后再使用加密算法加密即可

五、代码撸起来

楼主用vs2022新建了两个解决方案,分别是Application.Authorization(用来生成token),Application.WebAPI(用来token授权)

一、生成token

[ApiController]
[Route("[controller]")]
public class AuthorizationController : ControllerBase
{
public IConfiguration _configuration { get; }
public AuthorizationController(IConfiguration configuration)
{
_configuration = configuration;
} /// <summary>
/// 获取Token
/// </summary>
/// <param name="userName"></param>
/// <param name="pwd"></param>
/// <returns></returns>
[HttpGet]
[Route("GetToken")]
public dynamic GetToken(string userName= "xiaohemaio", string pwd= "123456")
{
// 验证用户和密码应该去查询数据库,此处省略
if(userName.Equals("xiaohemaio") && pwd.Equals("123456"))
{
// 有效载荷,这里可以自定义写,尽量避免敏感信息 Claim[] claims = new Claim[] {
new Claim("NickName",userName),
new Claim("Role","Admin")
};
// 需要加密,需要加密key
// NuGet引入:Microsoft.IdentityModel.Tokens
SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWTAuthorization:securitykey"])); SigningCredentials creds = new SigningCredentials(key,SecurityAlgorithms.HmacSha256); // NuGet引入:Microsoft.IdentityModel.Tokens.Jwt
// 官方规定了7个非强制但建议使用的字段:
// iss(issuer):签发人
// exp(expiration time) :过期时间
// sub(subject):主题
// aud(audience):受众
// nbf(not befaore):生效时间
// lat(issued at):签发时间
// jti(jwt id):编号 JwtSecurityToken token = new JwtSecurityToken(
issuer:_configuration["JWTAuthorization:issuer"],
audience: _configuration["JWTAuthorization:audience"],
claims: claims,
expires:System.DateTime.Now.AddMinutes(5),
signingCredentials: creds
); string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
return Ok(new { Data= returnToken ,Success=true,Msg="Token生成成功"});
}
return Ok(new { Data = string.Empty, Success = false, Msg = "Token生成失败" });
}
}
  "JWTAuthorization": {
"issuer": "xiaohemaio", // 签发人,可自定义
"audience": "xiaohemiao", // 受众,可自定义
"securitykey": "8cbe2b73be20b183bd787f31d4dc3f0d05bb2640495ebf8f52e790907d20f70a" // 加密key,根据需要自己生成 参考地址 https://crypot.51strive.com/sha256.html }

二、Token授权

[ApiController]
[Route("[controller]")]
public class AuthorizationController : ControllerBase
{ [HttpGet]
[Route("Get")]
public dynamic Get()
{
return Ok(new { Data = "test", Sueccess = true });
} [HttpGet]
[Route("GetAuthorizationData")]
[Authorize]
public dynamic GetAuthorizationData()
{
// 获取当前登录的用户名
var userName = HttpContext.AuthenticateAsync().Result.Principal.Claims.FirstOrDefault(x => x.Type.Equals("NickName"))?.Value; return new JsonResult(new { Data = userName, Sueccess = true });
} }
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(); {
// ************************2、JWT鉴权授权******************************************
// NuGet引入程序包:Microsoft.AspNetCore.Authentication.JwtBearer (如果是.net5则使用5.0及以上的版本,如是.net6 则使用6.0及以上版本,如是.net core 3.1 则使用3.0及以上版本)
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey= true,
ValidIssuer= Configuration["JWTAuthorization:issuer"], // Issuer 这个和应用Application.Authorization里面的设置一样,表示谁签发的Token
ValidAudience = Configuration["JWTAuthorization:audience"], // Audience 这个和应用Application.Authorization里面的设置一样,表示受众的Token
IssuerSigningKey =new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWTAuthorization:securitykey"])), // 拿到securitykey
AudienceValidator = (m,n,z) => { // 自定义规则
return true;
}
};
});
} } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseRouting(); // ********************1、启用鉴权*********************
app.UseAuthentication();
app.UseAuthorization(); app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
  "JWTAuthorization": {
"issuer": "xiaohemaio", // 签发人,可自定义
"audience": "xiaohemiao", // 受众,可自定义
"securitykey": "8cbe2b73be20b183bd787f31d4dc3f0d05bb2640495ebf8f52e790907d20f70a" // 加密key,根据需要自己生成 参考地址 https://crypot.51strive.com/sha256.html }

.Net Core之JWT授权的更多相关文章

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

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

  2. 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  3. 如何使用Swagger为.NET Core 3.0应用添加JWT授权说明文档

    简介 本教程采用WHY-WHAT-HOW黄金圈思维模式编写,黄金圈法则强调的是从WHY为什么学,到WHAT学到什么,再到HOW如何学.从模糊到清晰的学习模式.大家的时间都很宝贵,我们做事前先想清楚为什 ...

  4. Dotnet core使用JWT认证授权最佳实践(二)

    最近,团队的小伙伴们在做项目时,需要用到JWT认证.遂根据自己的经验,整理成了这篇文章,用来帮助理清JWT认证的原理和代码编写操作. 第一部分:Dotnet core使用JWT认证授权最佳实践(一) ...

  5. .Net Core官方的 JWT 授权验证

    什么是JWT? JSON Web令牌(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象.由于此信息是经过数字签名的,因此可以被验 ...

  6. 温故知新,.Net Core遇见JWT(JSON Web Token)授权机制方案

    什么是JWT JWT (JSON Web Token) 是一个开放标准,它定义了一种以紧凑和自包含的方法,用于在双方之间安全地传输编码为JSON对象的信息. 因此,简单来说,它是JSON格式的加密字符 ...

  7. .net core 学习小结之 自定义JWT授权

    自定义token的验证类 using System; using System.Collections.Generic; using System.IO; using System.Linq; usi ...

  8. ASP.NET Core 基于JWT的认证(一)

    ASP.NET Core 基于JWT的认证(一) Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计 ...

  9. Asp.Net Core基于JWT认证的数据接口网关Demo

    近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...

随机推荐

  1. 【记录一个问题】golang神坑,明明返回了接口指针类型的nil值,却无法用if判断

    先看看导致异常的代码: package main import ( "fmt" "log" ) type MyError1 struct{ MyErrorCod ...

  2. numpy中,从一片c_void_p指向的区域里获取数据

    以前采用的数据拷贝的笨办法: 1 bitmap_size = (1080, 1920, 3) 2 buf = create_string_buffer(bitmap_size[0]*bitmap_si ...

  3. 学习AJAX必知必会(3)~自动重启工具nodemon、缓存问题、请求超时和网络异常、取消重复请求

    1.nodemon 自动重启工具(自动重启基于nodejs开发的服务端应用) ■ nodemon 是一个工具,通过在检测到目录中的文件更改时自动重新启动node应用程序来帮助开发node.js. // ...

  4. Windows如何搭建SSL通信(非Web)

    自己研究了会儿,把结论发出来给有需要的人 第一步:准备环境 首先需要一台服务器(这不是废话吗),我这边用的windows2003, 还需要一台客户端,我用的是windwos2008 第二步:服务器环境 ...

  5. Spring中的单例模式

    Spring中的单例模式 单例模式的介绍 1.1 简介 ​ 保证整个应用中某个实例有且只有一个 1.2作用 保证一个类仅有一个实例,并且提供一个访问它的全局访问点. 单例模式的优点和缺点 单例模式的优 ...

  6. windows根据进程id杀死任务进程

    然后打开任务管理器找出来结束进程即可

  7. python25day

    内容回顾 面向对象的回顾 类 对象 怎么用 怎么继承 pickle模块 今日内容 继承(进阶的知识点) 经典类和新式类 python3所有类都继承object类 所有继承object的类都是新式类 不 ...

  8. MAC OS 常用快捷键

    删除文件或文件夹 commond + delete 复制文件或文件夹 commond + c 粘贴文件或文件夹 commond + v

  9. redhat更改yum源及安装PHP环境

    redhat更新yum源 删除同RHEL一同安装的yum源 rpm -qa|grep yum #查看本地yum yum list | wc -l #看个数 yum install pip #看现象 r ...

  10. Java线程--CyclicBarrier使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11867687.html Java线程--CyclicBarrier使用, 代码里头有详细注释: ...