【转载】C#集成JWT快速入门

server/2024/9/20 7:36:24/ 标签: c#, 开发语言, .net

一、JWT基本概念

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于在双方之间安全地传输信息作为JSON对象。这些信息可以被验证、信任,因为它们是数字签名的。JWT常用于身份验证和授权场景,特别是在微服务架构和分布式系统中。

JWT主要由三部分组成:Header(头部)、Payload(负载)和Signature(签名)。

二、JWT的生成

在C#中,我们可以使用System.IdentityModel.Tokens.Jwt命名空间下的类来生成JWT。以下是一个简单的示例:

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;public string GenerateJWT(string userId, string secretKey)
{var tokenHandler = new JwtSecurityTokenHandler();var key = Encoding.ASCII.GetBytes(secretKey);var tokenDescriptor = new SecurityTokenDescriptor{Subject = new ClaimsIdentity(new[]{new Claim(ClaimTypes.Name, userId)// 可以添加更多声明,如角色、权限等}),Expires = DateTime.UtcNow.AddDays(7),SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)};var token = tokenHandler.CreateToken(tokenDescriptor);return tokenHandler.WriteToken(token);
}

在上述代码中,我们首先创建了一个JwtSecurityTokenHandler实例。然后,我们定义了一个SecurityTokenDescriptor,它包含了JWT的主题(即用户信息)、过期时间以及签名凭据。最后,我们使用tokenHandler生成并返回JWT。

三、JWT的验证

验证JWT主要是检查其签名是否有效,以及是否过期。这可以通过JwtSecurityTokenHandler类的ValidateToken方法实现:

public bool ValidateJWT(string token, string secretKey, out ClaimsPrincipal principal)
{var tokenHandler = new JwtSecurityTokenHandler();var validationParameters = new TokenValidationParameters{ValidateIssuerSigningKey = true,IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey)),ValidateIssuer = false,ValidateAudience = false};SecurityToken validatedToken;try{principal = tokenHandler.ValidateToken(token, validationParameters, out validatedToken);return true;}catch (Exception){principal = null;return false;}
}

在上述代码中,我们首先创建了一个JwtSecurityTokenHandler实例和一个TokenValidationParameters实例。TokenValidationParameters包含了验证JWT所需的所有参数,如签名密钥等。然后,我们尝试使用tokenHandler.ValidateToken方法验证JWT。如果JWT有效,该方法将返回一个ClaimsPrincipal实例,该实例包含了JWT中的所有声明;否则,将抛出异常。

四、JWT的授权

在验证了JWT之后,我们可以从ClaimsPrincipal实例中获取用户的角色或权限,并根据这些信息进行授权。这通常是在服务端进行的,可以通过检查特定的声明(如rolepermission)来实现。例如:

if (principal.HasClaim(c => c.Type == ClaimTypes.Role && c.Value == "admin"))
{// 用户是管理员,允许访问受保护的资源
}
else
{// 用户不是管理员,拒绝访问受保护的资源
}

在上述代码中,我们首先检查ClaimsPrincipal实例是否包含一个类型为role且值为admin的声明。如果是,那么我们就认为用户是管理员,并允许其访问受保护的资源;否则,我们将拒绝其访问。

总结:JWT提供了一种安全、灵活的方式来传输用户信息,并可以用于身份验证和授权。在C#中,我们可以使用System.IdentityModel.Tokens.Jwt命名空间下的类来生成、验证和使用JWT。

 


http://www.ppmy.cn/server/18028.html

相关文章

嵌入式软件工程师要会画板子吗?

答案:要 作为嵌入式软件工程师,本来就经常和硬件打交道。调试各种协议也要看波形,用示波器什么的。软件玩多了也会腻,可以玩玩硬件,自己从 0 做出一个东西的感觉是不一样的。职业生涯那么长,多尝试一些总是好的,一个软硬件都懂的人,才能更好的带项目。 博主玩过很多板…

【编译原理】【《编译技术与应用》笔记】第二章:词法分析

文章目录 [toc]2.1|高级程序语言的词构成特性预定义词自定义词长度优先原则 2.2|词法的描述C语言的词法变量的正则表达式数值常量的正则表达式预定义词的正则表达式字符类常量的正则表达式注释的正则表达式空格的正则表达式回车换行的正则表达式C语言的词法 词法分析的实现框架…

鸿蒙入门11-DataPanel组件

数据面板组件 用于将多个数据的占比情况使用 占比图 进行展示 参数 参数形式 : DataPanel( options:{ values: number[], max?: number, type?: DataPanelType } ) 参数名 参数类型 是否必填 默认值 参数描述 values number[] 是 - 数据值列表 最大支持…

C++设计模式探讨(2)-单例模式

介绍 这段介绍来自网络: 单例模式是一种创建型的软件设计模式,在工程项目中非常常见。通过单例模式的设计,使得创建的类在当前进程中只有一个实例,并提供一个全局性的访问点,这样可以规避因频繁创建对象而导致的内存…

【产品经理修炼之道】- B端产品经理之业务系统设计

很多时候,业务系统建设好坏决定了企业的核心竞争力。作为产品经理,如何建设好业务系统这种OLTP类产品?本文从梳理业务流程、参与业务调研和设计业务系统三个步骤,教大家如何做好业务系统建设。 很多人都说设计B端产品最重要的是搞…

1.基于Springboot对SpringEvent初步封装

一:前置知识 Spring Event是Spring框架提供的一种事件机制,用于处理组件之间的通信。在复杂的系统中,模块或组件之间的通信是必不可少的。Spring Event可以用于以下场景: 1.系统间解耦:模块或组件之间通过事件进行通…

Django框架之python后端框架介绍

一、网络框架及MVC、MTV模型 1、网络框架 网络框架(Web framework)是一种软件框架,用于帮助开发人员构建Web应用程序和Web服务。它提供了一系列预先编写好的代码和工具,以简化开发过程并提高开发效率。网络框架通常包括以下功能…

鸿蒙应用开发-初见:入门知识、应用模型

基础知识 Stage模型应用程序包结构 开发并打包完成后的App的程序包结构如图 开发者通过DevEco Studio把应用程序编译为一个或者多个.hap后缀的文件,即HAP一个应用中的.hap文件合在一起称为一个Bundle,bundleName是应用的唯一标识 需要特别说明的是&…

《QT实用小工具·三十五》基于PathView,Qt/QML做的一个可以无限滚动的日历控件

1、概述 源码放在文章末尾 改项目实现了基于PathView,Qt/QML做的一个可以无限滚动的日历控件,下面是demo演示: 项目部分代码如下所示: import QtQuick 2.7 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4Bu…

被删除的照片和视频能找回吗?如何恢复手机删除的照片和视频?

手机里的照片和视频是我们记录生活的每一个瞬间,也是工作学习等场合经常用到的东西,一旦不慎丢失,将对我们造成很大损失。那么我们该如何恢复手机删除的照片和视频呢?通过掌握正确的恢复方法,能够最大程度地保护手机中…

mac配置maven

在 macOS 上配置 Maven 也相对简单。以下是一种常用的方法: 1. 安装maven **下载 Maven:**首先,你需要从 Maven 官网(https://maven.apache.org/download.cgi)下载最新版本的 Maven。你可以选择二进制压缩包&#xf…

黑马点评(十二) -- UV统计

一 . UV统计-HyperLogLog 首先我们搞懂两个概念: UV:全称Unique Visitor,也叫独立访客量,是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站,只记录1次。 PV:全称Page View&…

详解23种设计模式——单例模式

单例模式 | CoderMast编程桅杆单例模式 单例模式是最常用的设计模式之一,他可以保证在整个应用中,某个类只存在一个实例化对象,即全局使用到该类的只有一个对象,这种模式在需要限制某些类的实例数量时非常有用,通常全局…

新手Pytorch入门笔记-transforms.Compose()

我使用的图片是上图,直接下载即可 transforms.Compose 是PyTorch中的一个实用工具,用于创建一个包含多个数据变换操作的变换对象。这些变换操作通常用于数据预处理,例如图像数据的缩放、裁剪、旋转等。使用transforms.Compose 可以将多个数据…

PS学习笔记-抠图相关

选好颜色后,altdelete更换画布颜色、填充前景色 按住shift键自由缩放图片,调好后双击鼠标即可完成,或者点击工具栏的 对勾 在某图层下 CTRLT 变换图片,调好后双击鼠标即可完成,或者点击工具栏的 对勾 CTRLJ复制图…

揭秘快手互动神器:自动评论助力转化!

在这个信息爆炸的时代,每个内容创作者和企业都在寻找提升用户互动和转化的有效途径。无论是短视频、直播还是文章,如何让自己的内容脱颖而出,成为大家关注的焦点呢?今天,我们就要揭秘一款神奇的工具——快手自动评论软…

【代码随想录】day44

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、完全背包理论基础二、518零钱兑换 II三、377组合总和 Ⅳ总结 一、完全背包理论基础 完全背包:每个物品可以使用无数次。 二、518零钱兑换 II cla…

c#+unity基础

序列化: [SerializeField],点不出来,只能在面板上显示绑定游戏物体 //公有隐藏 特有函数 特有函数:不需要调用,自动执行 Awake最先执行->OnEable 面向对象思想 面向对象思想:分为具体对象和抽象对…

网站推广爬虫

网站推广爬虫是一种用于帮助网站推广的工具。它可以自动地收集和分析网站相关的数据,以便进行市场调研、竞争分析和优化策略等工作。以下是网站推广爬的一些常见功能和特点: .数据收集:网站推广爬虫可以通过抓取网页内容、提取关键信息和分析…

Docker② —— Cgroups详解

1. 概述 Cgroups 的全称是control groups,cgroups为每种可以控制的资源定义了一个子系统。Cgroups分为三个部分: cgroup 本身:对进程进行分组hierarchy:将 cgroup 形成树形结构subsystem:真正起到限制作用的部组件 cp…