本章主要讲解关于EntityFramwork Core的实际使用步骤,以及身份验证技术Token的实际使用步骤
1. EntityFramework Core
a: 什么是EntityFramework Core?
EntityFramework Core是轻量级,可扩展和开源的软件,同时也是跨平台的,是微软官方推荐的数据访问平台;EntityFramework Core同样也是目前比较流行的ORM(Object-Relational Mapper)框架。
b: 为什么使用EntityFramework Core?
跨平台,简单,安全
c: 怎么使用EntityFramework Core?
EntityFramework Core支持Code First模式
数据库不存在,需要先创建应用程序所需要的数据实体类和数据库上下文类,然后创建数据库和相关表;
数据库存在,可以使用已存在数据库反向生成Code First代码;
eg1: 数据库不存在
步骤1:首先NuGet安装Microsoft.EntityFrameworkCore.SqlServer组件和Microsoft.EntityFrameworkCore.Tools组件
步骤2:创建数据实体类和数据库上下文类
步骤3:在appsettings.json配置文件中创建数据库连接字符串
步骤4:在StartUp类中的ConfigureServices方法中注册数据库上下文类服务到容器
步骤5:可设置种子数据 ,初始表中的数据 (此步依据自己需要设置即可)
步骤6:打开程序包管理器控制台,生成迁移,执行迁移
- 生成迁移 Add-Migration InitDataBase
- 执行迁移 Update-DataBase
步骤7:更新数据库结构
直接更新数据实体类和数据库上下文类,再次生成迁移,执行迁移
eg2: 数据库存在
步骤1:首先NuGet安装Microsoft.EntityFrameworkCore.SqlServer组件和Microsoft.EntityFrameworkCore.Tools组件
步骤2:打开程序包管理器控制台,执行从数据库生成模型类的命令
Scaffold-DbContext ‘连接字符串’ 数据提供程序名称 -OutputDir 结果输出文件夹 -Context 数据上下文名 –DataAnnotations
示例:Scaffold-DbContext 'Data Source=.;Initial Catalog=SchoolDb; Integrated Security=True;' Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context SchoolContext
步骤3:在StartUp类中的ConfigureServices方法中注册数据库上下文类服务到容器
步骤4:更新数据库结构
直接更新数据实体类和数据库上下文类,生成迁移,执行迁移
2. 安全认证token的实现
a: 为什么使用token ?
为了验证使用者的身份,需要客户端向服务器端提供一个可靠的验证信息
b: 什么是jwt token?
jwt token : 为了验证使用者的身份,需要客户端向服务器端提供一个可靠的验证信息,称为token,这个token通常由Json数据格式组成,通过hash散列算法生成一个字符串,所以称为Json Web Token (Json表示令牌的原始值是一个Json格式的数据,web表示是在互联网传播的,token表示令牌,简称jwt)
jwt 由三部分组成,头部(Header),载荷(Payload)(这一部分主要是信息存储部分), 签名(Signature)(这一部分主要是确保信息没有被篡改)
c: 怎么使用jwt token实现身份验证?
第一步:使用nuget安装Microsoft.AspNetCore.Authentication.JwtBearer
第二步:在Startup类的ConfigureServices方法中添加如下代码
第三步:在Startup类的Configue方法中添加以下代码
第四步:创建JwtTokenUtil工具类,用于生成Jwt Token
第五步:登录成功,返回token
第六步:保护相应的动作方法
第七步:前端请求的时候设置请求头
headers['Authorization'] = 'Bearer ' + token
第八步:后端依据请求的token识别出请求的UserName
首先在Startup类中的ConfigureServices添加以下代码
然后给类型ClaimsPrincipal类型扩展一个方法
最后可以通过注入IHttpContextAccessor,从请求的上下文类HttpContext中获取到当前登录人的信息
结尾:本篇博客中一些描述如有错误,请大家指正