引子

前面说了用第三方类库生成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容器)中进行集中管理。

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

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

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

总结

上述讲到的方法一般都是比较常用的方法(这个好像是来自微软官方文档),先对于上篇文章,它相对比较灵活,不会涉及到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. 12、jmeter逻辑控制器-临界区控制器

    临界区:说白了就是不并发了 一个个的像独木桥 使用场景:比如提交一个数据  需要一个一个的提交  一个个的改   在数据库改操作的时候 需要用到 临界区控制器 案例:临界区控制器

  2. Mysql_5.7编译部署

    自述 - 概述:数据库是"按照数据结构来组织.存储和管理数据的仓库".是一个长期存储在计算机内的.有组织的.可共享的.统一管理的大量数据的集合:本文主要介绍mysql_5.7的部署 ...

  3. ABP vNext微服务架构详细教程——简介

    概述 该系列文章主要展示ABP vNext框架在微服务架构下的用法,提供一套可落地的技术实现思路,并演示各服务在Kubernetes下的部署方案. 基础概念 ABP vNext:基于ASP.NET C ...

  4. spring下的restTemplate使用

    首先上配置,由于restTemplate不支持一些返回格式,所以需要自己手动配置 /** * @Description : restTemplate配置类 * @Author : wzkris * @ ...

  5. 通过Dnsmasq自建干净的DNS服务

    不晓得为撒,用网上的一些公共DNS服务的时候,总是莫名其妙的有些网站无法解析,有时候114能解析,阿里DNS不行或者腾讯DNS不行,导致总是来回切换DNS,很是烦心. 于是就想着自己搭建一个DNS服务 ...

  6. 微信小程序中如何识别银行卡和身份证

    识别银行卡云函数card2/index.js: const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRE ...

  7. 不同时间格式转换问题_python2

    def unix_to_cst(data): """2019-03-17 11:00:00 --> Sun, 17 Mar 2019 11:00:00 GMT+08 ...

  8. 第八次团队作业:Beta冲刺(凡事预则立)

    这个作业属于哪个课程 2018级计算机和综合实验班 这个作业要求在哪里 Beta冲刺要求 这个作业的目标 Beta冲刺 改进完善的功能 完善之前年度报告功能 尽快上线小程序 增加的新功能 小程序打卡功 ...

  9. 《MySQL是怎样运行的》第五章小结

  10. SimpleITK和nibable读取nii文件

    import SimpleITK as sitk path = 'nii全路径' nii_obj = sitk.GetArrayFromImage(sitk.ReadImage(path)) #sha ...