当前位置: 首页 > news >正文

ASP.NET Core高级之认证与授权(一)--JWT入门-颁发、验证令牌

阅读本文你的收获

  1. 了解认证和授权的作用
  2. 了解在ASP.NET Core中实现身份认证的技术都有哪些
  3. 学习基于JWT认证并学会颁发和验证JWT令牌

一、重要的前置概念

在一个系统中,不是所有的功能和资源都能够被自由地访问,比如你存在银行系统里面的资金,不可能给我去提取,对吧。这就需要系统对用户进行一些访问的控制,从而使系统更加地安全。
Authentication(认证)和Authorization(授权)都是用于访问控制的概念,目的是确保只有合法用户可以访问系统资源。

  • Authentication(认证)是指验证用户身份的过程。通过认证,系统能够确认用户是真实的,准确地知道用户是谁。常见的认证方式包括用户名和密码、指纹识别、身份证验证等。认证成功后,用户才能被认为是合法用户,可以继续访问系统资源。

  • Authorization(授权)是指确定用户是否有权限访问特定资源的过程。认证成功后,系统需要根据用户的角色、权限等信息来判断用户是否有权访问某个资源。授权机制可以基于用户角色或权限级别进行,例如管理员拥有更高的权限,能够访问更多的资源,而普通用户只能访问受限资源。授权也可以是细粒度的,例如给用户赋予特定的操作权限,如读取、写入、删除等。

在ASP.NET Core中,可以使用以下技术实现身份认证(包括但不限于):

  1. Cookie身份认证:使用ASP.NET Core的认证中间件,将用户的认证信息存储在cookie中。可以使用AddAuthenticationAddCookie方法配置Cookie身份认证。

  2. JWT(JSON Web Token)身份认证:使用JWT作为认证令牌,将用户的认证信息加密并传输给客户端。可以使用AddJwtBearer方法配置JWT身份认证。

  3. OAuth身份认证:使用OAuth协议进行身份认证,允许用户使用第三方身份提供者进行登录。可以使用AddAuthenticationAddOAuth方法配置OAuth身份认证。

  4. OpenID Connect身份认证:基于OAuth协议的扩展,提供了更加丰富的身份认证功能。可以使用AddAuthenticationAddOpenIdConnect方法配置OpenID Connect身份认证。

  5. Session认证:ASP.NET Core中可以使用AddSession方法来配置会话认证。在使用会话认证时,服务器会为每个用户创建一个会话对象,并分配一个唯一的会话ID。服务器会将该会话ID存储在用户的浏览器cookie中,并在后续的请求中使用该会话ID来验证用户的身份。

以上技术可以根据具体的需求和场景进行选择和配置,也可以组合使用来实现更加复杂的身份认证方案。

二、JWT是什么?

JWT:JSON Web Token (JSON网络令牌)里面存的是JSON格式的数据,有三部分组成,以.号做分割, 头部.荷载.防伪签名, 经过一定的加密算法来生成。

作用:颁发给登录的用户,用户拿着这个令牌作为身份的凭证,来访问后续的授权资源。

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

2.1 JWT的组成结构

JSON Web Token由三部分组成,它们之间用圆点(.)连接。这三部分分别是:

  • Header – 头部
  • Payload -荷载
  • Signature -签名

例子:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJMb2dpbk5hbWUiOiJhZG1pbiIsIlN1cGVyQWRtaW4iOiJ0cnVlIiwibmJmIjoxNjM5NTQ4MDYyLCJleHAiOjE2Mzk1NDgyNDIsImlzcyI6IldYRiIsImF1ZCI6IkV2ZXJ5VGVzdE9uZSJ9.rfMYR5h26sv3j-WrjVgqB0K05fr9M4wFgCx4leZnqg8

可以到jwt.io官网上将以上JWT字符串进行调试,解析出原始的JSON数据。
在这里插入图片描述

2.2 JWT加密组装的过程

JWT令牌=Base64编码的header.Base64编码的payload.Base64编码的signature;
而signature又是通过HS256这种算法将Base64编码的header.Base64编码的payload的字符串进行加密所得。请看下面的演示代码:

//头部
header = {"alg": "HS256", "typ": "JWT"}
//荷载
payload = {"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
//生成签名
key = "secretkey123qwe!@#" //密钥可以自己设置
unsignedToken = encodeBase64(header) + '.' + encodeBase64(payload)  
signature = HMAC-SHA256(key, unsignedToken) //最后的JWT Token如下:
token = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature) 

二、JWT的使用场景

(1)Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。

(2)Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWT可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。

三、 JWT认证入门案例

开发环境:

操作系统: Windows 10 专业版
平台版本是:.NET 6
开发框架:ASP.NET Core WebApi
开发工具:Visual Studio 2022

3.1、颁发令牌

  1. 登录成功后,给用户颁发一个JWT的令牌
//引用命名空间
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;namespace XfTech.Demo.WebApi.Controllers;[Route("api/[controller]/[action]")]
[ApiController]
[Authorize]
public class AccountController : ControllerBase
{    /// <summary>/// 登录功能/// </summary>/// <param name="input"></param>/// <returns></returns>[HttpPost][Route("Login")][AllowAnonymous] //此方法允许匿名访问public IActionResult Login(LoginDto input){//第一步做模型验证if(!ModelState.IsValid) {//如果输入的参数无效,则直接返回return BadRequest();  //返回一个400状态码}//获取用户(根据输入的用户名和密码做查询,如果用户不为null则登录信息有效,具体请自行实现)var user = _userService.GetUser(input);if(user == null){return Ok(new { Code=-1, Msg="用户登录不成功"});}//荷载信息List<Claim> claims = new List<Claim>(){new Claim(ClaimTypes.Name, user.UserName),new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),//new Claim("role","guest"),//new Claim("sex","男")};//签名密钥var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("qwerty123456sdgdgsdgfsdgfsfdg"));//对秘钥加密var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);//过期时间DateTime expires = DateTime.Now.AddSeconds(2*3600); //设置了2小时//实例化JWT安全令牌对象var jwtToken = new JwtSecurityToken(issuer:   "XF",            //发布者audience: "everyone",      //受众(发布给谁用)claims:   claims,          //发起人 订阅者expires:  expires,//过期时间signingCredentials: credentials);   //秘钥//序列化jwt令牌 从而得到一个字符串string strToken = new JwtSecurityTokenHandler().WriteToken(jwtToken);return Ok(new  { AccessToken = strToken,Code = 0, Msg = "用户登成功", Data = user });}    
}

3.2、验证用户登录(验证JWT令牌)

要想使用JWT进行用户身份验证,必须使用UseAuthentication中间件; 在Program
.cs注册Authentication服务。AddAuthenticationAddJwtBearer方法。

//下载NuGet包
Microsoft.AspNetCore.Authentication.JwtBearer//配置服务
builder.Services.AddAuthentication(option =>
{//认证模式option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;//质询模式option.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(option =>
{option.RequireHttpsMetadata = false;//设置元数据地址或权限是否需要HTTPsoption.SaveToken = true;//Token验证参数option.TokenValidationParameters = new TokenValidationParameters{ValidateIssuerSigningKey = true, //是否验证签名IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("qwerty123456sdgdgsdgfsdgfsfdg")),ValidIssuer = "XF",         //有效的发行人ValidAudience = "everyone", //有效的受众ValidateIssuer = true,      //是否验证发行人ValidateAudience = true,    //是否验证受众ClockSkew = TimeSpan.Zero,ValidateLifetime = true     //是否验证过期时间};
});    //.....//启用身份验证中间件(不要遗漏哦)app.UseAuthentication(); app.UseAuthorization();

3.3 、接口测试-检查JWT验证是否有效

  1. 用[Authorize]特性保护Api
    在Api控制器或者方法上,加[Authorize]特性,需要引用命名空间:

using Microsoft.AspNetCore.Authorization;

  • [Authorize]加在控制器上,则该控制器下所有API方法需要身份授权后才能访问;
  • [Authorize]加在方法上,则仅该方法需要身份授权后才能访问。

另外,有一个[AllowAnonymous]特性,加在Api控制器或者方法上,允许匿名访问该Api或者控制器下所有Api方法。
在这里插入图片描述
Api资源被锁保护起来之后,如果没有登录直接访问,则会报401的错误。在Swagger中测试截图如下:
在这里插入图片描述

  1. ApiPost接口测试工具来测试

测试JWT
登录之后拿到了Token令牌,再测试创建用户接口,就能正常返回数据了。

加上头部信息再测试


本次是JWT的简单入门,下次我们会对这个JWT进行封装。
如果本文对你有帮助的话,请点赞+评论+关注,或者转发给需要的朋友。

相关文章:

ASP.NET Core高级之认证与授权(一)--JWT入门-颁发、验证令牌

阅读本文你的收获 了解认证和授权的作用了解在ASP.NET Core中实现身份认证的技术都有哪些学习基于JWT认证并学会颁发和验证JWT令牌 一、重要的前置概念 在一个系统中&#xff0c;不是所有的功能和资源都能够被自由地访问&#xff0c;比如你存在银行系统里面的资金&#xff0c…...

实例:NodeJS 操作 Kafka

本人是C#出身的程序员&#xff0c;c#很简单就能实现&#xff0c;有需要的可以加我私聊。但是就目前流行的开发语言&#xff0c;尤其是面向web方向应用的&#xff0c;我感觉就是Nodejs最简单了。下面介绍&#xff1a; 本文将会介绍在windows环境下启动Kafka&#xff0c;并通过n…...

AI实景无人直播创业项目:开启自动直播新时代,一部手机即可实现增长

在当今社会&#xff0c;直播已经成为了人们日常生活中不可或缺的一部分。无论是商家推广产品、明星互动粉丝还是普通人分享生活&#xff0c;直播已经渗透到了各行各业。然而&#xff0c;传统直播方式存在着一些不足之处&#xff0c;如需现场主持人操作、高昂的费用等。近年来&a…...

YOLOv5改进 | 损失函数篇 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数

一、本文介绍 本文给大家带来的是YOLOv5最新改进,为大家带来最近新提出的InnerIoU的内容同时用Inner的思想结合SIoU、WIoU、GIoU、DIoU、EIOU、CIoU等损失函数,形成 InnerIoU、InnerSIoU、InnerWIoU等新版本损失函数,同时还结合了Focus和AIpha思想,形成的新的损失函数,其…...

构建高效PythonWeb:GraphQL+Sanic

1.1 简介&#xff1a;在当今快速发展的技术时代&#xff0c;Web应用的性能和灵活性变得越来越重要。在众多技术中&#xff0c;GraphQL和Sanic以其独特的优势脱颖而出。GraphQL&#xff0c;作为一个强大的数据查询语言&#xff0c;为前端和后端之间的通信提供了极大的灵活性。而…...

【通义千问】大模型Qwen GitHub开源工程学习笔记(5)-- 模型的微调【全参数微调】【LoRA方法】【Q-LoRA方法】

摘要: 训练数据的准备 你需要将所有样本放到一个列表中并存入json文件中。每个样本对应一个字典,包含id和conversation,其中后者为一个列表。示例如下所示: [{"id": "identity_0","conversations": [{"from": "user",…...

PCL 大地坐标转空间直角坐标(C++详细过程版)

目录 一、算法原理二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 二、代码实现 头文件及读取保存函数见:PCL 空间直角坐标转大地坐标(直接求解法C…...

Linux之Shell编程

shell是什么 shell是一个命令行解释器&#xff0c;他为用户提供一个向linux内核发送请求以便运行程序的界面系统级程序&#xff0c;用户可以用shell来启动&#xff0c;挂起&#xff0c;停止甚至编写一些程序。 shell脚本的执行方式 脚本格式要求 脚本以#!/bin/bash开头脚本需…...

Unity组件开发--传送点

本组件仅实现A传送点到B传送的功能&#xff0c;是可以双向传送的&#xff0c;如果只要单向传送&#xff0c;可以另外改脚本实现&#xff1b; 先看效果&#xff1a; unity组件传送点演示 1.传送组件shader是怎么写的&#xff1a;这种效果的实现方案 shader编辑器是这样的&#…...

vue结合Cesium加载gltf模型

Cesium支持什么格式&#xff1f; Cesium支持的格式包括&#xff1a;3D模型格式&#xff08;如COLLADA、gITF、OBJ&#xff09;、影像格式&#xff08;如JPEG、PNG、GeoTIFF&#xff09;、地形格式&#xff08;如STL、Heightmap&#xff09;、矢量数据格式&#xff08;如GeoJSON…...

逆置算法和数组循环移动算法

元素逆置 概述&#xff1a;其实就是将 第一个元素和最后一个元素交换&#xff0c;第二个元素和倒数第二个元素交换&#xff0c;依次到中间位置。用途&#xff1a;可用于数组的移动&#xff0c;字符串反转&#xff0c;链表反转操作&#xff0c;栈和队列反转等操作。 逆置图解 …...

【MATLAB】数豆子

Matlab数豆子 创建一个变量来表示豆子的数量。例如&#xff0c;可以使用豆子数量 100;来表示有100颗豆子。 使用disp函数打印出豆子的数量。例如&#xff0c;可以使用disp([目前有 num2str(豆子数量) 颗豆子])来打印出当前豆子的数量。 进行豆子的计数操作。例如&#xff0c…...

QT C++中调用python脚本时,import第三方库失败问题解决

QT C中调用python脚本时&#xff0c;import第三方库失败问题解决 文章目录 QT C中调用python脚本时&#xff0c;import第三方库失败问题解决前言一、问题复现二、调试过程三、问题解决1 numpy问题解决2 matplotlib问题解决 四、补充说明五、参考资料 前言 项目需要&#xff0c…...

【AI视野·今日Robot 机器人论文速览 第七十期】Thu, 4 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Thu, 4 Jan 2024 Totally 17 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Many-Objective-Optimized Semi-Automated Robotic Disassembly Sequences Authors Takuya Kiyokawa, Kensuke Harada, Weiwei …...

Flutter中的布局组件介绍及使用

1. 引言 Flutter 是一款由 Google 开发的开源 UI 软件开发工具&#xff0c;可用于在单个代码库中构建漂亮、本机编译的应用程序。在 Flutter 中&#xff0c;布局是构建用户界面的核心部分之一。本文将介绍 Flutter 中的全部布局组件&#xff0c;以及它们的使用方式。 2. 基础…...

【面试高频算法解析】算法练习2 回溯(Backtracking)

前言 本专栏旨在通过分类学习算法&#xff0c;使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目&#xff0c;帮助您深度理解每种算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解的状态 专栏导航 二分查找回溯&#xff08;Backtracking&…...

认识Git

&#x1f30e;初识Git 初识Git 什么是Git Git的安装       Centos平台安装Git       Ubuntu平台安装Git Git的基本操作       创建远程仓库       配置Git 认识工作区、暂存区与版本库       添加文件到暂存区       将暂存区文件提交至本…...

@RequestParam,@RequestBody和@PathVariable 区别

RequestParam&#xff0c;RequestBody和PathVariable 这三者是spring常见的接受前端数据的注解&#xff0c;那么他们分别是接受什么的前端数据呢&#xff1f; RequestParam&#xff1a;这个注解主要用于处理请求参数&#xff0c;尤其是GET请求中的查询参数和表单参数。它可以用…...

vue3组件传参

1、props: 2、自定义事件子传父 3、mitt任意组件通讯 4、v-model通讯(v-model绑定在组件上) (1)V2中父子组件的v-model通信&#xff0c;限制了popos接收的属性名必须为value和emit触发的事件名必须为input,所以有时会有冲突; 父组件: 子组件: (2)V3中:限制了popos接收的属性名…...

React16源码: React中创建更新的方式及ReactDOM.render的源码实现

React当中创建更新的主要方式 ReactDOM.render || hydrate 这两个API都是我们要把整个应用第一次进行渲染到我们的页面上面能够展现出来我们整个应用的样子的一个过程这是初次渲染 setState 后续更新应用 forceUpdate 后续更新应用 replaceState 在后续被舍弃 关于 ReactDOM…...

长期使用Token Plan套餐在Taotoken平台带来的月度成本控制体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用Token Plan套餐在Taotoken平台带来的月度成本控制体验 对于个人开发者或小型团队而言&#xff0c;在探索和集成大模型能力…...

在Windows上优雅观看B站:BiliBili-UWP第三方客户端完全指南

在Windows上优雅观看B站&#xff1a;BiliBili-UWP第三方客户端完全指南 【免费下载链接】BiliBili-UWP BiliBili的UWP客户端&#xff0c;当然&#xff0c;是第三方的了 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBili-UWP 还在用浏览器看B站视频吗&#xff1f;卡…...

百度网盘Mac破解终极方案:解锁SVIP高速下载体验

百度网盘Mac破解终极方案&#xff1a;解锁SVIP高速下载体验 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 作为Mac用户&#xff0c;你是否曾因百度网盘…...

基于Python的自动化数据简报生成:从模板驱动到部署实践

1. 项目概述&#xff1a;数据简报的自动化生成利器如果你也和我一样&#xff0c;每天需要从一堆数据库、日志文件和API接口里捞出数据&#xff0c;然后吭哧吭哧地整理成PPT或者Word报告&#xff0c;那你一定懂这种重复劳动的痛苦。数据本身就在那里&#xff0c;但把它们变成老板…...

给每个 Agent 装上专属工具集:Multi-Agent 权限隔离的三种设计模式一次讲透

我第一次写多 Agent 系统时犯过一个错误&#xff1a;把所有工具塞进一个 tools 数组&#xff0c;然后把这个数组挂给每个 Agent。结果上线后发现&#xff1a;负责写文章摘要的 Agent&#xff0c;有时候莫名其妙地调用了删除接口&#xff1b;负责检索资料的 Agent&#xff0c;偶…...

双系统‘分手’指南:在UEFI模式下彻底卸载Ubuntu并回收磁盘空间(附EasyUEFI使用详解)

双系统卸载全攻略&#xff1a;安全移除Ubuntu并回收磁盘空间的终极指南 你是否曾经为了体验Linux而在Windows电脑上安装了Ubuntu双系统&#xff0c;现在却想回归单一操作系统&#xff1f;面对复杂的UEFI引导和磁盘分区&#xff0c;很多人担心操作不当会导致系统崩溃或数据丢失。…...

告别混乱!用Cadence Allegro SPB17.4从DXF文件创建PCB封装的完整清洁流程

告别混乱&#xff01;用Cadence Allegro SPB17.4从DXF文件创建PCB封装的完整清洁流程 在PCB设计领域&#xff0c;从机械图纸&#xff08;DXF&#xff09;快速创建精确的封装是工程师常面临的挑战。许多设计师都经历过这样的困扰&#xff1a;导入DXF后&#xff0c;封装在3D预览中…...

别再手动写Prompt了!Lovable原生AI编排引擎深度解析(附12个已验证行业工作流)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Lovable无代码AI应用构建指南 Lovable 是一款面向业务人员与开发者的低门槛 AI 应用构建平台&#xff0c;它通过可视化编排、预置模型组件和自然语言驱动逻辑&#xff0c;实现无需编写代码即可部署可运…...

Gemini3.1Pro解决新媒体小编选题难痛点

做新媒体的小编&#xff0c;最怕的不是写&#xff0c;而是“今天写什么”。 选题总是来得很急&#xff0c;热点总是变化很快&#xff0c;账号又要求持续更新&#xff0c;结果就是&#xff1a;内容压力大、时间不够用、框架搭不出来。如果你每天都在追热点、找角度、写标题、搭结…...

争分夺秒与步步为营:Infoseek舆情系统如何重构危机响应的时间哲学

“黄金4小时”甚至“黄金1小时”&#xff0c;是公关行业奉行的铁律。然而&#xff0c;为了追求速度而仓促发出的声明&#xff0c;常常因为事实核查不清、逻辑存在漏洞或情感表达不当&#xff0c;引发更猛烈的“二次翻车”。这种“翻车”对企业公信力的伤害&#xff0c;往往比原…...