.NET 8.0 - 使用 JWT Bearer Token 保护 API .NET 8.0 - 身份验证 API 博客

2025-06-07

.NET 8.0 - 使用 JWT Bearer Token 保护 API

.NET 8.0 - 身份验证 API

博客

了解使用 JWT Bearer Tokens 进行 API 身份验证

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

什么是 JWT?

JWT,即 JSON Web Token,是一项开放标准 (RFC 7519),用于在各方之间以 JSON 对象的形式安全地传输信息。由于信息经过数字签名,因此可以验证和信任。JWT 可以使用密钥(采用 HMAC 算法)或公钥/私钥对(使用 RSA 或 ECDSA 算法)进行签名。

JWT 的结构

JWT 由三部分组成,以点(.)分隔:Header、Payload 和 Signature。

  1. 标头:标头通常由两部分组成:令牌类型(JWT)和签名算法(例如,HMAC SHA256 或 RSA)。
{
  "alg": "HS256",
  "typ": "JWT"
}
Enter fullscreen mode Exit fullscreen mode
  1. 有效载荷:有效载荷包含声明。声明是关于实体(通常是用户)及其附加数据的声明。声明分为三种类型:注册声明、公开声明和私有声明。
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
Enter fullscreen mode Exit fullscreen mode
  1. 签名:要创建签名部分,您必须获取编码的标头、编码的有效负载、秘密和标头中指定的算法,并对其进行签名。
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)
Enter fullscreen mode Exit fullscreen mode

为什么使用 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>
Enter fullscreen mode Exit fullscreen mode
  1. 令牌验证:服务器验证令牌的签名并检查其有效性(包括有效期、签发机构等)。如果有效,服务器将处理请求。如果无效,则返回未授权错误。

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
Enter fullscreen mode Exit fullscreen mode
  • 添加对项目的引用(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
Enter fullscreen mode Exit fullscreen mode
  • 设置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"
}
Enter fullscreen mode Exit fullscreen mode
  • 添加密钥来验证和签署 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"
}
Enter fullscreen mode Exit fullscreen mode
  • 配置启动设置,例如 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 用户界面
    Swagger 用户界面

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

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

  • 添加 API 授权。
    API授权

  • GET——获取所有用户。
    API 获取全部

笔记:

在这里检查源代码。

GitHub 徽标 sandeepkumar17 / AuthDemoApi

NET 8.0 - 使用 JWT Bearer Token 的身份验证 API 示例






如果您有任何意见或建议,请在下面的评论部分中留言。

文章来源:https://dev.to/techiesdiary/net-60-jwt-token-authentication-using-the-example-api-91l
PREV
高级软件工程师应避免的错误
NEXT
.NET 8.0 - 使用存储库模式和 Dapper 进行日志记录和单元测试的清洁架构 .NET 8.0 - 使用存储库模式和 Dapper 进行日志记录和单元测试的清洁架构