了解使用 JWT Bearer Tokens 进行 API 身份验证
在现代 Web 开发领域,API 安全至关重要。实现此目标的最可靠方法之一是使用 JWT(JSON Web Tokens)作为 Bearer Token 进行 API 身份验证。本文将深入探讨 JWT Bearer Token 身份验证的含义、原理和方法。

示例代码:https://download.youkuaiyun.com/download/hefeng_aspnet/91474255
什么是 JWT?
JWT,即 JSON Web Token,是一项开放标准 (RFC 7519),用于在各方之间以 JSON 对象的形式安全地传输信息。由于信息经过数字签名,因此可以验证和信任。JWT 可以使用密钥(采用 HMAC 算法)或公钥/私钥对(使用 RSA 或 ECDSA 算法)进行签名。
JWT 的结构
JWT 由三部分组成,以点(.)分隔:Header、Payload 和 Signature。
标头:标头通常由两部分组成:令牌类型(JWT)和签名算法(例如,HMAC SHA256 或 RSA)。
{
"alg": "HS256",
"typ": "JWT"
}
有效载荷:有效载荷包含声明。声明是关于实体(通常是用户)及其附加数据的声明。声明分为三种类型:注册声明、公开声明和私有声明。
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
签名:要创建签名部分,您必须获取编码的标头、编码的有效负载、秘密和标头中指定的算法,并对其进行签名。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
为什么使用 JWT 进行 API 身份验证?
1、无状态: JWT 是无状态的;服务器不需要存储会话信息。这使得它们具有可扩展性,并减轻了服务器的负载。
2、安全性: JWT 经过签名,以便接收者可以验证令牌的真实性。
3、紧凑: JWT 紧凑,使得它们能够高效地在 HTTP 标头中发送。
4、互操作性:作为基于 JSON 的标准,JWT 易于在不同的编程语言和平台上使用。
JWT Bearer Token 身份验证的工作原理
以下是 JWT Bearer Token 身份验证通常如何工作的分步说明:
1、客户端登录:客户端向服务器发送带有用户凭证的登录请求。
2、服务器验证:服务器验证凭证。如果凭证正确,服务器将创建包含用户信息的 JWT。
3、Token 颁发:服务器将 JWT 发送回客户端。此 token 存储在客户端,通常存储在本地存储或 Cookie 中。
4、后续请求:对于每个后续请求,客户端将 JWT 作为 Bearer 令牌包含在授权标头中。
Authorization: Bearer <token>
令牌验证:服务器验证令牌的签名并检查其有效性(包括有效期、签发机构等)。如果有效,服务器将处理请求。如果无效,则返回未授权错误。
JWT实现示例
让我们使用 Clean Architecture 来了解 .NET 8.0 API 中的 JWT 令牌实现。
解决方案和项目设置
首先,设置DB及其对象,您可以使用AuthDemo.Infrastructure/Sql代码示例文件夹下共享的脚本。
一旦我们的后端准备就绪,打开 Visual Studio 2022 并使用 Clean Architecture 设置所需的项目,如果您想了解有关 Clean Architecture 实现的更多信息,请阅读本文。
设置核心层:在解决方案下,创建一个新的类库项目,并将其命名为AuthDemo.Core。
• 添加一个新文件夹Entities并添加一个名为 的新实体类User。
设置应用层:添加另一个类库项目并将其命名为AuthDemo.Application。
• 添加对项目的引用Core。
• 添加一个新文件夹Interfaces并创建一个新界面并将其命名为IUserRepository。
• 另外,创建一个新的接口,并将其命名IUnitOfWork为实现工作单元。
设置基础设施层:添加一个新的类库项目并将其命名为AuthDemo.Infrastructure。
• 添加本项目需要使用的包。
Install-Package Dapper
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.DependencyInjection.Abstractions
Install-Package System.Data.SqlClient
• 添加对项目的引用(Application、和Core),并添加一个新文件夹Repository。
• 之后,让我们IUserRepository通过创建一个新类来实现该接口UserRepository。
• 另外,IUnitOfWork通过创建新类来实现接口UnitOfWork
• 最后,将接口及其实现注册到 .NET Core 服务容器。添加一个新的静态类ServiceCollectionExtension,并通过注入的方式在其下添加 RegisterServices 方法IServiceCollection。
• 稍后,我们将在 API 的ConfigureService 方法下注册它。
设置 API 项目: 添加一个新的 .NET 8.0 Web API 项目并将其命名为AuthDemoApi。
• 添加对项目的引用(Application、和Infrastructure),并添加以下包。
Install-Package Swashbuckle.AspNetCore
Install-Package Microsoft.IdentityModel.Protocols
Install-Package System.IdentityModel.Tokens.Jwt
Install-Package Microsoft.IdentityModel.JsonWebTokens
Install-Package Microsoft.AspNetCore.Authentication.JwtBearer
• 设置appsettings.json文件来管理 API 设置并替换ConnectionStrings部分下的 DB 连接字符串。
"ConnectionStrings": {
//Update values in the connection string.
"DBConnection": "Data Source=localhost\\SQLEXPRESS; Initial Catalog=AuthDemoDB; Trusted_Connection=True;MultipleActiveResultSets=true"
}
• 添加密钥来验证和签署 JWT 令牌。
"AppSettings": {
//Replace it with your secret key to verify and sign the JWT tokens, It can be any string.
"Secret": "8c8624e2-2afc-76a5-649e-9b9bf15cf6d3"
}
• 配置启动设置,例如 RegisterServices(在AuthDemo.Infrastructure项目下定义),并添加 Swagger UI(作为Bearer身份验证方案)。
• 删除默认的控制器/模型类,并在 Model 文件夹下添加两个类(AuthenticateRequest和)来处理 API 请求和响应。AuthenticateResponse
• 添加一个Helper文件夹并添加以下类。
• AppSettingsappsettings.json- 从文件中映射选项。
• AuthorizeAttribute- 验证授权。
• Common- 添加 GenerateJwtToken 方法来生成 JWT 令牌。
• JwtMiddleware- 验证令牌并在 Jwt 验证成功后将用户附加到上下文。
• 添加一个新的控制器并命名UsersController。
• 实现AuthenticateAPI 来验证用户并生成令牌。
• GetAllAPI 返回所有用户,并添加Authorize属性将其置于 API 安全性之后。
审查最终的项目结构

运行并测试 API
运行项目并测试 API 方法。
• Swagger 用户界面

• 未经身份验证运行 API 会引发401 - Unauthorizeed错误。

• 使用 API 验证用户并获取 JWT 令牌Authenticate。

• 添加 API 授权。

• GET——获取所有用户。

本文就介绍到这里了。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
3164

被折叠的 条评论
为什么被折叠?



