Restaurants WebAPI(四)——Identity
文章目录
- 项目地址
- 一、Authentication
- 1.1 配置环境(解决类库包无法引用)
- 1.2 使用Authentication控制Controller的访问
- 1.3 获取User的Context
- 1.3.1 在Application下创建User文件夹
- 1. 创建`User.cs` record类封装角色信息
- 2. 创建`UserContext.cs`提供接口给程序使用
项目地址
- 教程作者:
- 教程地址:
- 代码仓库地址:
- 所用到的框架和插件:
dbt
airflow
一、Authentication
1.1 配置环境(解决类库包无法引用)
Restaurants.Domain
层安装
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.11" />
- 在
Restaurants.Domain
层的Entities文件夹
下创建User实体
using Microsoft.AspNetCore.Identity;namespace Restaurants.Domain.Entities
{public class User:IdentityUser{}
}
- 在
Restaurants.Infrastructure
层的Persistence文件夹里
将DbContext
继承改为IdentityDbContext<User>
- 在Extensions里进行注册
services.AddIdentityApiEndpoints<User>().AddEntityFrameworkStores<RestaurantsDbContext>();
- 在引入
AddIdentityApiEndpoints
时,一直无法引入,原因是:在类库项目中不能直接引用WebApplicationBuilder、ApplicationBuilder等类,这些类位于Microsoft.ASPNetCore程序集中,但是无法通过Nuget包引用
- 在程序入口注册服务
app.MapIdentityApi<User>();
- EF将User表写入数据库在类库
Restaurants.Infrastructure
下
add-migration IdentityAdded
update-database
- 迁移成功后,数据库里就有了权限表
- 发送一个post请求,注册一个用户
1.2 使用Authentication控制Controller的访问
- 在
Restaurants.API
层的Extensions文件夹
里注册服务
- 在需要添加验证的Controller类上面添加
[Authorize]
,如果类里有不需要验证就可以访问的api,在该controller上添加[AllowAnonymous]
3. 设置成功后,当访问https://localhost:7044/api/restaurants/1
报错401Unauthorized
; 但是访问https://localhost:7044/api/restaurants
可以获取所有restaurants的列表
1.3 获取User的Context
1.3.1 在Application下创建User文件夹
- 创建User文件用来管理和获取权限中的User信息
1. 创建User.cs
record类封装角色信息
- 将用户的Id, Email , Roles,封装到CurrentUser类里,并且通过IsInRole方法,检查用户的角色集合中是否包含指定的角色。返回true 或者 false
namespace Restaurants.Application.User
{public record CurrentUser(string Id, string Email, IEnumerable<string> Roles){public bool IsInRole(string role) => Roles.Contains(role);}
}
2. 创建UserContext.cs
提供接口给程序使用
- 从当前 HTTP 请求的上下文中获取用户的身份信息(CurrentUser),并提供一个接口 IUserContext 供应用程序使用。
- 主要逻辑:
- 获取
IHttpContextAccessor
服务httpContextAccessor
- 通过
httpContextAccessor
服务获取到HttpContext
的User信息 - 判断user信息,然后获取我们需要的内容
- 将需要内容
new一个CurrentUser
类
- 获取