.NET 8.0 使用 JWT Bearer Token 保护 API

了解使用 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——获取所有用户。

本文就介绍到这里了。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hefeng_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值