在本文中,我将演示如何使用ASP.NET Core 3.1构建RESTful Web API,使用Entity Framework Core与现有数据库连接,创建JWT令牌提供对API访问的保护权限。如果您不熟悉.NET Core,可以先阅读我的.NET Core 3.1简介。
这篇文章的各节如下:
- 什么是RESTful API?
- 什么是JWT令牌?
- 添加控制器和脚手架构建RESTful API
- 使用Postman测试API接口
- 使用Cors解决前端调用API跨域的问题
- 创建一个JWT令牌保护我们的API接口
什么是REST API?
由于客户端种类的增加(移动端,基于浏览器的SPA,桌面应用程序,IOT应用程序等),我们需要更好的方法将数据从服务器传输到客户端,而与所用技术和服务器无关。
REST API解决了这个问题。REST代表状态转移。REST API基于HTTP,并为应用程序提供了使用轻量级JSON格式进行通信的功能。它们在Web服务器上运行。本文不着重讲REST API,本博客的其他章节会详细解答。
REST由以下实体组成:
资源:资源是唯一可识别的实体(例如:数据库中的数据,图像或任何数据)。
端点:可以通过URL标识符访问资源。
HTTP方法:HTTP方法是客户端发送到服务器的请求的类型。我们对资源执行的操作应遵循此操作。
HTTP标头:HTTP标头是一个键值对,用于在客户端和服务器之间共享其他信息,例如:
- 发送到服务器的数据类型(JSON,XML)。
- 客户端支持的加密类型。
- 与身份验证相关的令牌。
- 应用程序需要的客户数据。
数据格式:JSON是通过REST API发送和接收数据的通用格式。
什么是JWT令牌?
我们了解了REST API是什么,在这里将了解JWT承载令牌是什么,它是为了保护REST API的。
JWT代表JSON Web Token。它是一种开放标准,为两个实体(客户端和服务器)之间安全地传输数据定义了更好的方法,是目前流行的跨域身份验证解决方案。
JWT由令牌提供者或身份验证服务器者使用密钥进行数字签名。JWT帮助资源服务器使用相同的密钥来验证令牌数据,以便您可以信任数据。
JWT由以下三个部分组成:
Header(标头文件):令牌类型的编码数据和用于对数据进行签名的算法。
{
"alg": "HS256", //签名使用的算法HS256
"typ": "JWT" //typ属性表示令牌的类型
}
Payload(有效荷载):打算共享申明的编码数据,JWT默认提供了以下7个属性设置,也可以自定义属性字段(类似Map中设置)。
默认参数:
iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT
Signature(签名文件):通过使用秘钥签名(编码的标头+编码的有效荷载)创建。签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。
最终的JWT令牌将如下所示:Header.Payload.Signature。Token分为3部分,以. 号分割。下面是令牌的工作流程。
步骤1:客户要求凭证
客户端将请求与必要的信息一起发送到身份验证服务器,以证明其身份。
步骤2:建立凭证
认证服务器接收令牌请求并验证身份。如果发现有效,将创建带有必要声明的令牌(如前所述),并将JWT令牌发送回客户端。
步骤3:客户端将令牌发送到资源服务器
对于对资源或API服务器的每个请求,客户端都需要在标头中包含一个令牌,并使用其URI请求资源。
步骤4:资源服务器验证令牌
请按照以下步骤验证令牌:
- 从身份验证标头中读取令牌。
- 从令牌中拆分标头,有效荷载和签名。
- 用创建令牌时使用的相同密钥创建接收的标头和有效荷载的签名。
- 检查新创建的签名和从令牌接收的签名是否均有效。
- 如果签名相同,则令牌有效(中间未被更改),并且它们提供对所请求资源的访问。
- 如果签名不同,则会将未经授权的响应发送回客户端。(在中间,如果声明受到警告,它们将生成不同的签名,因此将限制资源访问。)
不要使用JWT共享机密信息,因为JWT可以解码,并且可以查看其拥有的声明或数据。
以下部分说明了如何创建REST API并使用令牌对其进行保护。
添加控制器和脚手架构建RESTful API
之前的博客已经写过如何使用创建ASP.NET Core Web API项目,以及如何使用Entity Framework Core 的Code First的迁移机制去同步数据库表字段等,这里就不在进行详述,不清楚的码友转到“NET Core 项目中通过EF Core的Code First方式进行数据库的迁移”进行查看。
右键单击Controllers文件夹,然后选择添加->控制器,在弹出的添加基架的对话框中,选择“使用Entity Framework的API控制器”,然后单击“添加”。
在下一个对话框中,从”模型类"的下拉列表中选择我们定义的"Employee"这个Model类,然后单击+号以添加我们定义的数据库的上下文"EmployeeDbContext"。您可以保留默认控制器的名称,然后点击"添加"。
至此,脚手架工具开始在工作。
自动创建数据库上下文和CRUD(创建,读取,更新和删除)操作的方法被称为scaffolding(脚手架)。
脚手架生成的EmployeesController.cs文件里的内容如下:
namespace EFCoreMigration.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class EmployeesController :