什么是 JWT ?

从 https://jwt.io/ 可以了解到对 JWT 的描述:JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

JWT 是一个开放的,RFC 7519 工业标准方法,用来在两个部分之间表示安全声明。

下面来看一个 JWT 的例子:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjEyMjAiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoi55So5oi3NTk4OCIsImlzcyI6IkhaRyIsImF1ZCI6IkhaRyJ9.ipS3XPIF6QFm98olSaQzdqQ5vVrIR-_ACgaBFt0AFCg
上面是一个 JWT。可以看到,整体被两个点分为三部分,依次为 header,payload,加密部分。
header 部分:
base64 编码,这部分可以通过 base64 解码得到,示例中的解码后为:

{
"alg": "HS256",
"typ": "JWT"
}

其中,alg 表示服务端加密所用的算法,typ 表示 token 为 JWT

payload 部分代表附加的信息,可以传递一些用户信息等,也是 base 64 编码,示例中解析后为 :

{
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier": "1220",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name": "用户5988",
"iss": "HZG",
"aud": "HZG"
}

都是一些声明,可以在生成 JWT 的时候声明。

第三部分是加密部分,也就是使用 header 中的算法,把 header 和 payload 部分加密,用来验证传递的信息是否被修改。

如何在 ASP.NET Core 中集成 JWT?

首先我们需要考虑的是要实现什么功能?我们这里只是实现了简单的 JWT 签发功能,不做过多讨论

  • 生成 token

IJwtService.cs

using System.Threading.Tasks;

namespace JWTSample.Jwt;

/// <summary>
/// Jwt 功能接口
/// </summary>
public interface IJwtService
{
// 生成 JWT token
string GetnerateJWTToken(UserDto userDto);
}

JwtService.cs

using System;
using System.Linq;
using System.IdentityModel.Tokens.Jwt;
using System.Text;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Http; namespace JWTSample.Jwt; /// <summary>
/// JWT 功能类
/// </summary>
public class JwtService : IJwtService
{
// 配置
private readonly IConfiguration _configuration;
public JwtService(IConfiguration configuration)
{
_configuration = configuration;
} /// <summary>
/// 生成 JWT
/// </summary>
/// <param name="userDto">用户信息</param>
/// <returns></returns>
public string GetnerateJWTToken(UserDto userDto)
{
var claims = new Claim[]
{
new Claim(ClaimTypes.Name, userDto.UserName),
new Claim(ClaimTypes.Role, userDto.Roles),
// 用户所在的分组
new Claim("groups", userDto.Groups)
}; var issuer = _configuration[JwtOptionsConst.IssuerSettingPath];
var audience = _configuration[JwtOptionsConst.AudienceSettingPath];
var security = _configuration[JwtOptionsConst.SecurityKeySettingPath];
var expires = DateTime.Now.AddHours(Convert.ToDouble(_configuration[JwtOptionsConst.ExpiresHourSettingPath])); SymmetricSecurityKey symmetricSecurityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(security));
var signingCredentials = new SigningCredentials(symmetricSecurityKey, SecurityAlgorithms.HmacSha256); var jwtSecurityToken = new JwtSecurityToken(claims: claims, issuer: issuer, audience: audience, expires: expires, signingCredentials: signingCredentials);
var tokenHandler = new JwtSecurityTokenHandler(); return tokenHandler.WriteToken(jwtSecurityToken);
}
}

如何使用?我们可以直接在控制器中注入使用

using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Security.Claims;
using System.IdentityModel.Tokens.Jwt;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using JWTSample.Jwt;
using JWTSample.Models; namespace JWTSample.Controllers; public class AuthController : Controller
{
private readonly IJwtService _jwtService; public AuthController(IJwtService jwtService)
{
_jwtService = jwtService;
} [AllowAnonymous]
[HttpPost]
public IActionResult Login([FromBody] LoginUserInfo loginUserInfo)
{
if (loginUserInfo.Name == null)
{
return Ok(new
{
Message = "用户名不能为空!"
});
} var userDto = new UserDto()
{
UserId = new Random().Next(1000),
UserName = loginUserInfo.Name,
Groups = "技术部",
Roles = "软件工程师",
Email = "123456789@qq.com",
Phone = "123456789"
};
var token = _jwtService.GetnerateJWTToken(userDto); return Ok(new
{
Token = token
});
}
}

ASP.NET Core 简单集成签发 JWT (JSON Web Tokens)的更多相关文章

  1. Java分布式:JWT(JSON Web Tokens)

    Java分布式:JWT(JSON Web Tokens) 0.优势 Session方式存储用户状态占用大量服务器内存.一般而言,大型应用还需要借助一些KV数据库和一系列缓存机制来实现Session的存 ...

  2. JWT & JSON Web Tokens

    JSON Web Tokens https://jwt.io json web token example https://jwt.io/introduction/ https://medium.co ...

  3. jwt(JSON Web Tokens)的一道题目代码分析

    题目链接https://github.com/wonderkun/CTF_web/tree/5b08d23ba4086992cbb9f3f4da89a6bb1346b305/web300-6 参考链接 ...

  4. 单点登录-JWT(Json Web Tokens)

    来自:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html 1.跨域认证 1.用户向服务器发送用户名和密码. 2.服务 ...

  5. [翻译]Introduction to JSON Web Tokens

    JWT: Json Web Tokens JWT是一种开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于将各方之间的信息安全地传输为JSON对象.因为它是经过数字签名的,所以该信息可以进 ...

  6. 如何简单的在 ASP.NET Core 中集成 JWT 认证?

    前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...

  7. ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露

    一.前言 在涉及到后端项目的开发中,如何实现对于用户权限的管控是需要我们首先考虑的,在实际开发过程中,我们可能会运用一些已经成熟的解决方案帮助我们实现这一功能,而在 Grapefruit.VuCore ...

  8. ASP.NET Core WebAPI中使用JWT Bearer认证和授权

    目录 为什么是 JWT Bearer 什么是 JWT JWT 的优缺点 在 WebAPI 中使用 JWT 认证 刷新 Token 使用授权 简单授权 基于固定角色的授权 基于策略的授权 自定义策略授权 ...

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

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

随机推荐

  1. Visual Studio 2022 下载链接及激活密钥

    Visual Studio 2022 下载链接:https://visualstudio.microsoft.com/zh-hans/vs/ 激活码: 专业版: TD244-P4NB7-YQ6XK-Y ...

  2. 洛谷P7814 「小窝 R3」心の記憶

    题意 第一行给定两个数字\(n\) \(m\) \((m \ge n)\)分别代表给定字符串长度以及需要构造出的字符串长度 第二行给定一个长度为\(n\)的字符串 (假设原来的字符串是\(a\) 需要 ...

  3. qiankun 2.x 运行时沙箱 源码分析

    简介 从源码层面详细讲解了 qiankun 框架中的 JS 沙箱 和 样式沙箱的实现原理. 序言 沙箱 这个词想必大家应该不陌生,即使陌生,读完这篇文章也就不那么陌生了 沙箱 (Sandboxie) ...

  4. Git上传项目到码云提示Push rejected: Push to origin/master was rejected

    感谢大佬:https://blog.csdn.net/weixin_41499217/article/details/82985582 Push rejected: Push to origin/ma ...

  5. 关于CALayer的疑惑

  6. ubuntu关机重启命令介绍

    转载请注明来源:https://www.cnblogs.com/hookjc/ 重启命令: 1.reboot    2.shutdown -r now 立刻重启(root用户使用)    3.shut ...

  7. k8s补充

    k8s补充 容器云发展及主要内容 1.云计算,交付标准(iaas--openstack) 国内:阿里云一华为云(振兴杯)百度云(私有云) 国外:AWS 2.平台即服务(PAAS) 例如:新浪云(号称免 ...

  8. fuzz——AFL基础使用方法

    最近打 ctf 的时候感觉有点遇到瓶颈,就来 fuzz 这块看看. AFL 全称为 American huzzy loop,是 Fuzzing 最高级的测试工具之一.这个工具对有源码和无源码的二进制程 ...

  9. UVM中重要函数

    1.get_full_name() 获取这个节点的完整层次,这函数在object中就有定义,但是在component类中进行了重载,实现输出从uvm_test_top到当前节点的路径(是通过执行m_s ...

  10. Spring Boot部署之 web项目war包运行

    传统的部署方式:将项目打成war包,放入tomcat 的webapps目录下面,启动tomcat,即可访问. 具体打war包流程: 1.pom.xml配置文件修改: 2.改造启动类,如果是war包发布 ...