.net jwt实现

news2025/6/7 7:09:43

.NET 中实现 JWT 认证:详细指南

在现代的 Web 应用开发中,安全认证是至关重要的一环。JSON Web Token(JWT)作为一种广泛使用的认证机制,为 API 提供了安全、便捷的身份验证方式。本文将详细介绍如何在 ASP.NET Core 项目中实现 JWT 认证。

一、JWT 简介

JWT 是一种用于在网络应用间安全传输信息的开放标准(RFC 7519)。它以 JSON 对象的形式在各方之间安全地传输声明。JWT 通常由三部分组成:头部(Header)、负载(Payload)和签名(Signature)。这种结构使得 JWT 可以在客户端和服务器之间安全地传递用户信息,并且可以通过签名验证信息的完整性。

二、实现步骤

1. 安装必要的 NuGet 包

在 ASP.NET Core 项目中,我们需要安装 Microsoft.AspNetCore.Authentication.JwtBearer 包。这个包提供了实现 JWT 认证所需的核心功能。可以通过 Visual Studio 的 NuGet 包管理器或者使用命令行工具来安装:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

2. 配置 JWT 认证服务

Startup.cs 文件的 ConfigureServices 方法中,我们需要配置 JWT 认证服务。这一步主要是设置令牌验证参数,确保接收到的 JWT 是合法的。

public void ConfigureServices(IServiceCollection services)
{
    // 其他服务配置...

    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
   .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = Configuration["Jwt:Issuer"], // 发行人,例如: "https://yourdomain.com"
            ValidAudience = Configuration["Jwt:Audience"], // 受众,例如: "https://yourdomain.com/api"
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"])) // 安全密钥
        };
    });

    // 其他服务配置...
}

同时,我们需要在 appsettings.json 文件中配置 JWT 的发行人、受众和密钥:

{
  "Jwt": {
    "Issuer": "",
    "Audience": "",
    "SecretKey": "" // 请确保这是一个安全的密钥
  }
}

这里的配置是 JWT 认证的基础,发行人、受众和密钥的正确设置可以确保令牌的合法性和安全性。

3. 在管道中启用认证和授权中间件

Startup.csConfigure 方法中,我们需要调用 UseAuthenticationUseAuthorization 方法来启用认证和授权中间件。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 其他中间件配置...

    app.UseAuthentication(); // 启用认证中间件
    app.UseAuthorization(); // 启用授权中间件

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

这一步确保了在请求处理过程中,会对请求进行认证和授权检查。

4. 生成 JWT 令牌

在用户登录成功后,我们需要生成 JWT 令牌。通常,我们会创建一个服务类来处理令牌的生成。

public class TokenService
{
    private readonly IConfiguration _configuration;

    public TokenService(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public string GenerateJwtToken(string username)
    {
        var claims = new List<Claim>
        {
            new Claim(JwtRegisteredClaimNames.Sub, username),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
            // 可以添加其他自定义声明...
        };

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var token = new JwtSecurityToken(
            issuer: _configuration["Jwt:Issuer"],
            audience: _configuration["Jwt:Audience"],
            claims: claims,
            expires: DateTime.UtcNow.AddDays(1), // 设置过期时间
            signingCredentials: creds);

        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}

在这个服务类中,我们创建了一个包含用户信息的声明列表,并使用配置的密钥对令牌进行签名。

5. 使用 JWT 令牌保护 API 端点

为了保护 API 端点,我们可以在控制器或操作方法上使用 [Authorize] 属性。

[ApiController]
[Route("api/[controller]")]
[Authorize] // 需要认证才能访问此控制器中的端点
public class MyProtectedController : ControllerBase
{
    // 控制器操作方法...
}

这样,只有携带有效 JWT 令牌的请求才能访问这些受保护的端点。

6. 客户端发送 JWT 令牌

客户端在发送请求到受保护的 API 端点时,需要在 HTTP 请求的 Authorization 头中包含 JWT 令牌。令牌通常以 Bearer 前缀开始。

例如,使用 JavaScript 的 fetch API 发送请求:

const token = 'your_jwt_token';
fetch('https://your-api.com/api/protected', {
    headers: {
        'Authorization': `Bearer ${token}`
    }
})
.then(response => response.json())
.then(data => console.log(data));

三、总结

通过以上步骤,我们可以在 ASP.NET Core 项目中实现 JWT 认证。JWT 认证提供了一种无状态的认证方式,使得 API 可以在分布式系统中更安全、更高效地进行身份验证。在实际应用中,我们还需要注意密钥的安全管理,以及令牌的过期时间设置,以确保系统的安全性。同时,客户端在使用 JWT 令牌时,也需要妥善管理令牌,避免令牌泄露带来的安全风险。希望本文对你在 .NET 中实现 JWT 认证有所帮助。

======================================================================
前些天发现了一个比较好玩的人工智能学习网站,通俗易懂,风趣幽默,可以了解了解AI基础知识,人工智能教程,不是一堆数学公式和算法的那种,用各种举例子来学习,读起来比较轻松,有兴趣可以看一下。
人工智能教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在电脑上轻松访问 iPhone 文件

我需要将 iPhone 下载文件夹中的文件传输到 Windows 11 电脑上。我该怎么做&#xff1f;我可以在 Windows 11 上访问 iPhone 下载吗&#xff1f; 由于 iOS 和 Windows 系统之间的差异&#xff0c;在 PC 上访问 iPhone 文件似乎颇具挑战性。然而&#xff0c;只要使用正确的工具…

C语言字符数组输入输出方法大全(附带实例)

在 C语言中&#xff0c;字符数组是一种特殊的数组&#xff0c;用于存储和处理字符串。理解字符数组的输入和输出操作对于初学者来说至关重要&#xff0c;因为这是处理文本数据的基础。 字符数组的定义与初始化 在讨论输入输出之前&#xff0c;我们先来回顾一下字符数组的定义…

短视频矩阵SaaS系统:开源部署与核心功能架构指南

一、系统架构概述 短视频矩阵系统是基于SaaS&#xff08;软件即服务&#xff09;模式的多平台内容管理解决方案&#xff0c;通过开源技术实现账号聚合、智能创作、跨平台分发及数据闭环。系统采用微服务架构&#xff0c;支持高并发场景下的弹性扩展。 二、核心功能模块开发逻辑…

oss:上传图片到阿里云403 Forbidden

访问图片出现403Forbidden问题&#xff0c;我们可以直接登录oss账号&#xff0c;查看对应权限是否开通&#xff0c;是否存在跨域问题

4. 数据类型

4.1 数据类型分类 分类 数据类型 说明 数值类型 BIT(M) 位类型。M指定位数&#xff0c;默认值1&#xff0c;范围1 - 64 TINYINT [UNSIGNED] 带符号的范围 -128 ~ 127&#xff0c;无符号范围0 ~ 255&#xff0c;默认有符号 BOOL 使用0和1表示真和假 SMALLINT [UNSIGNED] 带符号是…

MySQL基础(二)SQL语言、客户端工具

目录 三、SQL语言 3.1 概念 3.2 基本操作 四、客户端工具 三、SQL语言 3.1 概念 SQL&#xff08;Structured Query Language&#xff09;结构化查询语言。SQL用于对存储数据&#xff0c;更新&#xff0c;查询和管理关系型数据库的程序设计语言。 通常执行对数据库的增删改…

CppCon 2015 学习:C++ in the audio industry

实时编程&#xff08;real-time programming&#xff09;&#xff1a;音频处理对延迟极度敏感&#xff0c;要求代码必须非常高效且稳定。无锁线程同步&#xff08;lock-free thread synchronization&#xff09;&#xff1a;避免阻塞&#xff0c;提高性能&#xff0c;尤其是在多…

C++算法-动态规划2

第 4 题 字符串分割 (Word Break) 难度: Medium备注&#xff1a;出自 leetcode题目描述 Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words. For example, given s "l…

软信天成:数据驱动型背后的人工智能,基于机器学习的数据管理

在数字化转型浪潮中&#xff0c;当代企业如同逆水行舟&#xff0c;不进则退。无数企业希望通过数字化转型捕获全新的市场机遇&#xff0c;改善财政状况&#xff0c;在未来市场竞争中占据一席之地。要想获得成功的数字化转型&#xff0c;关键因素在于具备可靠、及时的数据用以支…

MySQL提升

事务 事务&#xff1a;在多个操作合在一起视为一个整体。要么就不做、要么就做完。 事务应该满足ACID A : 原子性。不可分割。C : 一致性。追求的目标&#xff0c;在开始到结束没有发生预定外的情况。I : 隔离性。不同的事务是独立的。D : 持久性。系统崩溃&#xff0c;数据依然…

go语言的锁

本篇文章主要讲锁&#xff0c;主要会涉及go的sync.Mutex和sync.RWMutex。 一.锁的概念和发展 1.1 锁的概念 所谓的加锁和解锁其实就是指一个数据是否被占用了&#xff0c;通过Mutex内的一个状态来表示。 例如&#xff0c;取 0 表示未加锁&#xff0c;1 表示已加锁&#xff…

VUE解决页面请求接口大规模并发的问题(请求队列)

方案1&#xff1a; 请求队列 // RequestQueue.js export default class RequestQueue {constructor(maxConcurrent) {this.maxConcurrent maxConcurrent; // 最大并发请求数this.currentConcurrent 0; // 当前并发请求数this.queue []; // 请求队列this.requestId 0; // …

IDEA安装迁移IDEA配置数据位置

需求 因为C盘有清空风险&#xff0c;需要把IDEA&#xff08;2025&#xff09;安装位置以及配置数据都挪到D盘。 安装 到官网下载安装包 安装&#xff0c;这里可以改下安装位置 这几个选项随意&#xff0c;然后一直下一步就好 完成后重启或不重启都随意 迁移数据 初次安…

Blazor-表单提交的艺术:如何优雅地实现 (下)

在上一章节中我们使用HTML的方式介绍了如何在Blazor框架下进行表单的提交&#xff0c;而在Blazor框架中也为我们内置了<EditForm>组件来代替原始的HTML,<form>&#xff0c;下面我们将对<EditForm>的用法进行讲解&#xff0c;并将两种表单方式进行对比&#x…

五子棋网络对战游戏的设计与实现设计与实现【源码+文档】

五子棋网络对战游戏的设计与实现 摘 要 在现代社会中,及其它无线设备越来越多的走进普通老百姓的工作和生活。随着3G技术的普及与应用&#xff0c;基于Java开发的软件在上的使用非常的广泛&#xff0c;增值服务的内容也是越来越多&#xff0c;对丰富人们的生活内容、提供快…

Vue基础(14)_列表过滤、列表排序

Array.prototype.filter()【ES5】 filter() 方法创建给定数组一部分的浅拷贝&#xff0c;其包含通过所提供函数实现的测试的所有元素。 语法&#xff1a; filter(callbackFn) filter(callbackFn, thisArg) 参数&#xff1a; callbackFn(回调函数)&#xff1a;为数组中的每个元…

Spring Boot项目中JSON解析库的深度解析与应用实践

在现代Web开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为轻量级的数据交换格式&#xff0c;已成为前后端通信的核心桥梁。Spring Boot作为Java生态中最流行的微服务框架&#xff0c;提供了对多种JSON库的无缝集成支持。本文将深入探讨Spring B…

我用Amazon Q写了一个Docker客户端,并上架了懒猫微服商店

自从接触了Amazon Q&#xff0c;我陆陆续续写了不少小软件&#xff0c;其中这个项目是一个典型的例子&#xff0c;自己平时来使用&#xff0c;也分享给一些 NAS 爱好者来用。 故事还要用上次折腾黑群晖说起&#xff0c;本意想把 NAS 和打印机共享二合一的&#xff0c;所以把闲着…

Django CMS 的 Demo

以下是关于 Django CMS 的 Demo 示例及相关资源的整理 安装与运行 Django CMS 示例 使用 djangocms-installer 快速创建 Django CMS 项目&#xff1a; pip install django_cms djangocms -p . mysite安装记录 pip install django-cms Looking in indexes: https://pypi.tun…

在 UE5 蓝图中配置Actor类型的Asset以作为位置和旋转设置目标

目标 UE5的蓝图的事件图表里面&#xff0c;有一个模块&#xff08;节点&#xff09;如图&#xff0c;这是一个设置Actor的location和rotation量的模块&#xff0c;其中需要接收一个Target作为输入&#xff0c;这个Target应该就是一个在map中具备location和rotation信息的实例化…