(三)使用.NET Core3.1和EF Core构建RESTful API

在本文中,我将演示如何使用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 : 
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值