引子

前面说了用第三方类库生成JWT的故事,给我带来了很大的方便,并且我也承诺要写一篇用常规方法生成JWT的文章(一般都是用微软官方的类库),因此才有了这篇文章。

另外,在前面的文章中,我要纠正一下一些错误JWT的整个结构决定了JWT只能作为临时的授权认证解决方案,如果对用户的机密性要求比较高,必须用有状态控制管理的解决方案,JWT只能作为一般性方案使用,它的应用场合主要是由多个WebAPI构成的多进程多线程多接口这样的微服务架构,是为了解决使用状态管理带来的不便才应用而生,一般JWT必须和HTTPS配合才会具有安全性。这是因为JWT作为一种可被破解的数据,只有TLS加密后,才不会被真正破解。

在微软的Indentiy认证框架中(我个人感觉应该叫ASP.NET Core Indentity),MVC和WebAPI虽然使用不同的Nuget包,但本质是一样的……废话不多说了,直接正题开始:有请我们的主角:JwtSecurityTokenHandler(从名字中就知道它和数据库操作有关,JWT中的数据一般都是来自用户数据库,helper一般用来表示资源管理),后面我们会通过它来实现JWT的生成。

实施

和前面一样,我们这里主要讲解最常用的非对称算法的JWT,这里采用的算法是RSA,当然你也可以采用其他算法来达到目标。

首先需要安装nuget包Microsoft.AspNetCore.Authentication.JwtBearer,当然,有的文章会让你安装一个System.IdentityModel.Tokens.JWT的包,这个完全不需要,因为前面的包已经包含后者了,你只要在引用包以后,构建一下工程,在dubug目录里面找到项目生成文件,就会发现这个dll被放进去了。

由于ASP.NET Core是以依赖注入为主的,而这个包作为一个Service(服务),需要使用其自身提供的扩展方法来注入ASP.NET Core 的WebApplication的Service对象(IOC容器)中进行集中管理。

点击查看实现代码
builder.Services.AddAuthentication()..AddJwtBearer(jwtOptions =>{
jwtOptions.Authority = "https://jwtserver.test.net";
//jwtOptions.Audience = "jwtresouce";
jwtOptions.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],//发行者
ValidAudience = builder.Configuration["Jwt:Audience"], //订阅者
IssuerSigningKey = new RsaSecurityKey(RSA.Create(2048)) //jwt签名算法
};
})

之后再创建一个用来生成JWT的控制器(~~个人比较推荐使用控制器,而不是MiniAPI,感觉MiniAPI更适合比较简单的场景,比较复杂的场景还是得用控制器~~)。这样可以使得我们每次访问时获取到一个临时的JWT。
先说说大体流程:

  1. 先创建一个用来生成JWT的JwtSecurityTokenHandler对象,为后面的工作提供基础
  2. 再创建一个数组,用来存放用户信息
  3. 创建SecurityTokenDescriptor对象,设置JWT的加密算法,有效期等属性
  4. 调用之前创建的JwtSecurityTokenHandler对象的CreateToken方法,创建一个令牌对象,再调用WriteToken方法,获得到字符串格式的JWT
  5. 返回结果
点击查看实现代码
[HttpPost]
public string CreateJwtSecurityToken()
{
var tokenHandler = new JwtSecurityTokenHandler(); var mookdata = new Dictionary<string, string>();
mookdata[ClaimTypes.Name] = "John Doe";
mookdata[ClaimTypes.Email] = "johndoe@example.com";
mookdata[ClaimTypes.Role] = "vistor"; var claims = new Claim[mookdata.Count - 1];
foreach (var item in mookdata)
{
for (int i = 0; i < claims.Length; i++)
{
claims[i] = new Claim(item.Key, item.Value);
}
} var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new RsaSecurityKey(RSA.Create(2048)),
SecurityAlgorithms.RsaSha256Signature)
}; var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token); return tokenString;
}

总结

上述讲到的方法一般都是比较常用的方法(这个好像是来自微软官方文档),先对于上篇文章,它相对比较灵活,不会涉及到x509证书的问题,而且解决方案比较多,容易应用。

关于生成JWT,我也是简单的了解和使用,因此层次不少太深,如果读者在其中发现了问题,也欢迎各位提出宝贵的意见,谢谢。

关于JWT,我想说这只是WebAPI授权鉴权的开端,不是终点,如果有时间,我会再写一篇结合JWT来授权鉴权的文章,来更好的理解JWT的应用,希望我的文章会给您带来帮助,让我们一起期待吧!

AspNetCore 成长杂记(一):JWT授权鉴权之生成JWT(其二)的更多相关文章

  1. SpringCloud 2020.0.4 系列之 JWT用户鉴权

    1. 概述 老话说的好:善待他人就是善待自己,虽然可能有所付出,但也能得到应有的收获. 言归正传,之前我们聊了 Gateway 组件,今天来聊一下如何使用 JWT 技术给用户授权,以及如果在 Gate ...

  2. spring cloud jwt用户鉴权及服务鉴权

    用户鉴权 客户端请求服务时,根据提交的token获取用户信息,看是否有用户信息及用户信息是否正确 服务鉴权 微服务中,一般有多个服务,服务与服务之间相互调用时,有的服务接口比较敏感,比如资金服务,不允 ...

  3. Spring Boot整合实战Spring Security JWT权限鉴权系统

    目前流行的前后端分离让Java程序员可以更加专注的做好后台业务逻辑的功能实现,提供如返回Json格式的数据接口就可以.像以前做项目的安全认证基于 session 的登录拦截,属于后端全栈式的开发的模式 ...

  4. [转]Node.js 应用:Koa2 使用 JWT 进行鉴权

    本文转自:https://www.cnblogs.com/linxin/p/9491342.html 前言 在前后端分离的开发中,通过 Restful API 进行数据交互时,如果没有对 API 进行 ...

  5. Node.js 应用:Koa2 使用 JWT 进行鉴权

    前言 在前后端分离的开发中,通过 Restful API 进行数据交互时,如果没有对 API 进行保护,那么别人就可以很容易地获取并调用这些 API 进行操作.那么服务器端要如何进行鉴权呢? Json ...

  6. koa2服务端使用jwt进行鉴权及路由权限分发

    大体思路 后端书写REST api时,有一些api是非常敏感的,比如获取用户个人信息,查看所有用户列表,修改密码等.如果不对这些api进行保护,那么别人就可以很容易地获取并调用这些 api 进行操作. ...

  7. [原创]SpringSecurity控制授权(鉴权)功能介绍

    1.spring security 过滤器链 ​ spring security中的除了用户登录校验相关的过滤器,最后还包含了鉴权功能的过滤器,还有匿名资源访问的过滤器链,相关的图解如下: 2.控制授 ...

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

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

  9. 【Spring Cloud & Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权

    一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证授权.鉴权的逻辑,结合 ...

  10. shiro jwt 构建无状态分布式鉴权体系

    一:JWT 1.令牌构造 JWT(json web token)是可在网络上传输的用于声明某种主张的令牌(token),以JSON 对象为载体的轻量级开放标准(RFC 7519). 一个JWT令牌的定 ...

随机推荐

  1. Nginx常用经典配置|反向代理、HTTPS重定向、端口转发

    二级目录映射 目前前后端项目分离场景多了以后,一般是前端一个端口,后端一个端口. 如前端是https://example.com/index.html,调用的接口是https://example.co ...

  2. Centos 7 .Net core后台守护进程Supervisor教程

    ASP.NET Core应用程序发布linux在shell中运行是正常的.可一但shell关闭网站也就关闭了,所以要配置守护进程, 用的是Supervisor,本文主要记录配置的过程和过程遇到的问题 ...

  3. Strimzi-Kafka-Operator外围小记

    Strimzi-Kafka-Operator 从不同的角度看下Operator解决的问题 Kafka管理Operator-https://github.com/strimzi/strimzi-kafk ...

  4. Vue的官方脚手架 Vue-cli 安装使用解析

    ------------恢复内容开始------------ 1.首先什么是vue-cli 可以知道Vue-cli是一个官方提供的脚手架,主要作用是用来快速搭建Vue的项目模板,可以预先定义好项目的结 ...

  5. WSL安装Ubuntu 22.04 (2)

    1.安装系统环境 1.1.设置软件包源为国内镜像 参考:Ubuntu更换国内镜像源 - 知乎 1.2.更新系统软件包 sudo apt-get update && sudo apt-g ...

  6. 手写一个简易的ajax

    function ajax(url,successFul){ const xhr=new XMLHttpRequest() xhr.open("Get",url,true) xhr ...

  7. 解决 SMTP Error: data not accepted php邮件发送失败的问题

    php 发送邮件 出现  SMTP Error: data not accepted   1.正常情况下 都是正常的 但是偶尔 发送失败了 163.com 邮箱发送不了了. 所以去查了下问题所在  在 ...

  8. 基于深度学习的车型识别系统(Python+清新界面+数据集)

    摘要:基于深度学习的车型识别系统用于识别不同类型的车辆,应用YOLO V5算法根据不同尺寸大小区分和检测车辆,并统计各类型数量以辅助智能交通管理.本文详细介绍车型识别系统,在介绍算法原理的同时,给出P ...

  9. Skywalking搭建

    因毕设前端太丑,所以后端要稍微搞的高大上一点才能忽悠住老师,所以分享一下搭建skywalking的步. 我是参考https://baijiahao.baidu.com/s?id=17211835411 ...

  10. swagger-ui 导出离线文档md格式

    <dependency> <groupId>io.github.swagger2markup</groupId> <artifactId>swagger ...