引子

前面说了用第三方类库生成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. 循环文件夹汇总所有下载发票的Excel文件数据

    Dim a As String, n As Integer, wbs As Workbook ThisWorkbook.Sheets(1).Cells.Clear a = Dir(ThisWorkbo ...

  2. 整数划分问题(Java递归)

    整数划分问题(Java递归) 文章目录 整数划分问题(Java递归) 0. 问题描述 1.递归式 2.代码 3.参考 0. 问题描述 整数划分问题 将正整数n表示成一系列正整数之和:n=n1+n2+- ...

  3. 接口测试之object []如何类型传参

    接口测试时参数类型为object[],时如单选,多选提.传参值如下

  4. maven插件汇总

    编译Java源码,一般只需设置编译的jdk版本 <plugin> <groupId>org.apache.maven.plugins</groupId> <a ...

  5. 在Mac上不常用但会用到的命令

    文章目录 1. chflags 2. rename 1. chflags chflags hidden filename 给文件添加隐藏属性 chflags nohidden filename 去掉文 ...

  6. 10. XrmToolBox

    XrmToolBox是一个连接到MicrosoftDataverse的Windows应用程序,可以为任何在MicrosoftDataverse上构建的产品提供了简化定制.配置和操作任务的工具,包括Dy ...

  7. 如何加快打开网页的速度------通过调节“QoS数据包计划程序”的“限制可保留宽带”实现&如何解决win10可能找不到gpedit.msc的问题

    参考:http://www.windowszj.com/news/win10/42119.html http://www.docin.com/p-1510367352.html(QoS数据包计划程序有 ...

  8. 3、IOC创建对象的方法

    目录 3.IOC创建对象的方法 4.Spring配置 4.1.别名 4.2.Bean的配置 4.3.import 5.依赖注入 5.1.构造器注入 5.2.Set方式注入[重点] 5.3.扩展方式注入 ...

  9. Linux & 标准C语言学习 <DAY9_1>

        2.函数传参:         1.函数中定义的变量属于该函数,出了该函数就不能再被别的函数直接使用         2.实参与形参之间是以赋值的方式进行传递数据的,并且是单项值传递     ...

  10. Nacos 服务发现

    更多内容,前往 IT-BLOG 一.Nacos 简介 Nacos 是阿里的一个开源产品,它是针对微服务架构中的服务发现.配置管理.服务治理的综合型解决方案.Nacos 使服务更容易注册,并通过 DNS ...