一、什么是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. Mybatis 学习记录 续

    项目结构如下: 1.数据库建表 表名:user 结构: 内容: 2.pom.xml文件更新如下: 注:其中build部分尤其需要重视 <?xml version="1.0" ...

  2. 一文读懂mysql权限系统

    前言: MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的SELECT.INSERT.UPDATE和DELETE权限.附加的功能包括有匿名的用户并对于MySQL特定 ...

  3. golang中gomodule讲解

    0. GOMODULES模式 1. GOPATH的缺点 1. 无版本控制概念 2. 无法同步一致第三方版本号 3. 无法指定当前项目引用的第三方版本号 2. go1.11版本之后可以使用GoModul ...

  4. golang中的goroutine

    1. 概念 go中可以并发执行的活动单元称为goroutine当一个go程序启动时,一个执行main function的goroutine会被创建,称为main goroutinego func() ...

  5. 使用VSCode在本地电脑上对树莓派远程开发

    目的及原理 有时身边没有额外的显示器和键盘,或者有时树莓派在另一个屋子连接着路由器,那么当我们想在树莓派上做开发时就可以使用VS Code的远程开发能力.下面一张图显而易见地说明了远程开发的工作原理( ...

  6. docker镜像制作Dockerfile

    使用 Dockerfile 定制镜像 从刚才的 docker commit 的学习中,我们可以了解到,镜像的定制实际上就是 定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作 的 ...

  7. Basler相机启动问题xml读取出错

    切记!同一张网卡上多网口分别连多相机的时候,不要用同一个网段!!很容易出错!

  8. 使用Xamarin开发移动应用示例——数独游戏(七)添加新游戏

    项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 现在我们增加添加新游戏的功能,创建一个页面,编辑初始局面,并保存到数据库. ...

  9. 营销MM让我讲MySQL日志顺序读写及数据文件随机读写原理

    摘要:你知道吗,MySQL在实际工作时候的两种数据读写机制? 本文分享自华为云社区<MySQL日志顺序读写及数据文件随机读写原理>,作者:JavaEdge . MySQL在实际工作时候的两 ...

  10. 在IDE中普通项目打成jar包

    第一步: File---->Project Structe 第二步: 选择From modules.. 第三步:选择对应的Module和对应的JAR,然后点击ok 第四步:选择好对应的属性,然后 ...