本文,代码继承自第三章内容往下继续写的,如果看不懂,请看第三章代码!
[学习C#—ABP vNext框架:第三章(使用DDD领域驱动设计实现.NetCoreApi项目) - 掘金 (juejin.cn)] (juejin.cn/post/726215…)
一、概念
-
用户(User):表示应用程序中的一个用户。每个用户都有一个唯一的标识符(UserID)和一组属性(如用户名、密码、电子邮件地址等)。
-
角色(Role):表示应用程序中的一种角色或权限。角色可以用于对不同的用户组施加不同的访问控制。每个角色都有一个唯一的标识符(RoleID)和一个角色名称。
-
身份(Identity):表示用户在应用程序中的身份和认证状态。用户可以通过身份提供者(如本地数据库、外部身份提供商如Google、Facebook等)进行认证,并获得一个身份凭证(如Cookie或令牌)。
-
声明(Claim):表示用户身份的附加信息,如姓名、邮件地址、角色等。声明可以用于在应用程序中对用户进行精细的权限控制。
-
用户存储(User Store):用于将用户和用户属性存储在持久化存储(如数据库)中的组件。可以使用默认的实现(如Entity Framework)或自定义实现。
-
角色存储(Role Store):用于将角色和角色属性存储在持久化存储中的组件。也可以使用默认的实现或自定义实现。
-
登录(Login):表示用户使用身份提供者进行身份验证的过程。登录会生成一个身份凭证(如Cookie或令牌)。
-
注册(Register):表示用户创建新帐户的过程。注册会创建一个新用户,并将其存储到用户存储中。
-
密码重置(Password Reset):表示用户重置密码的过程。可以通过电子邮件或安全问题等方式进行密码重置。
-
访问控制(Access Control):表示用户对应用程序资源的访问权限控制。可以使用角色、声明等进行精细的访问控制配置。
-
身份验证(Authentication):表示验证用户身份的过程,确保用户是合法和经过认证的。
-
授权(Authorization):表示在用户身份验证通过后,允许用户访问特定资源或执行特定操作的过程。
.NET Identity提供了一套易于使用和灵活的API,可以轻松管理用户身份和访问控制,并且可以与ASP.NET Core的其他功能(如认证中间件、授权策略等)无缝集成。
二、引入管理Nuget包
三、集成用户身份模块
1、在ABP_vNext_Shop_Module类上使用DependsOn特性集成ABP的Identity内容
using Volo.Abp;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.EntityFrameworkCore;
using ABP_vNext_Shop.Context;
using Volo.Abp.EntityFrameworkCore.MySQL;
using Volo.Abp.Application;
using Volo.Abp.AutoMapper;
using Volo.Abp.Swashbuckle;
using Microsoft.OpenApi.Models;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Serilog;
using Volo.Abp.Identity;
using Volo.Abp.Identity.EntityFrameworkCore;
using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.PermissionManagement;
namespace ABP_vNext_Shop
{
[DependsOn(
typeof(AbpAutofacModule),//依赖ABP 的IOC容器模板
typeof(AbpAspNetCoreMvcModule),//依赖ABP的 MVC模板
typeof(AbpEntityFrameworkCoreModule),//依赖ABP的 EF-Core模板
typeof(AbpEntityFrameworkCoreMySQLModule),//依赖ABP的 EF-Core-MySQL模板
typeof(AbpDddApplicationModule),//依赖ABP的 ApplicationModule模板
typeof(AbpAutoMapperModule),//依赖ABP的 AutoMapper自动映射模板
typeof(AbpSwashbuckleModule),//依赖ABP的 Swagger模板
typeof(AbpAspNetCoreSerilogModule),//依赖ABP的 Serilog日志模板
//集成用户身份模块
typeof(AbpIdentityDomainModule),//依赖ABP的 用户身份领域模型模板
typeof(AbpIdentityEntityFrameworkCoreModule), //依赖ABP的 身份模块的ef模板
typeof(AbpIdentityApplicationModule), //依赖ABP的 身份模块的Application应用层模板 实现增删改查功能
typeof(AbpIdentityHttpApiModule), //依赖ABP的 身份模块的webApi模板 实现自动生成控制器以及接口
//集成权限模块
typeof(AbpPermissionManagementEntityFrameworkCoreModule), //依赖ABP的 权限模块的ef模板
//集成账户模块
typeof(AbpAccountApplicationModule), //依赖ABP的 账户模块account模板 //生成账户功能
typeof(AbpAccountHttpApiModule), //依赖ABP的 账户模块account API 模板 生成注册、重置密码...接口
typeof(AbpAccountWebModule) //依赖ABP的 账户模块account web 模板 //生成登录、退出...接口
)]
public class ABP_vNext_Shop_Module : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddControllers();
context.Services.AddEndpointsApiExplorer();
//加载配置文件app.json内容
var config = context.Services.GetConfiguration();
//1、加载Abp_ServerContext到IOC容器
context.Services.AddAbpDbContext<Abp_ServerContext>();
//2、加载DbContext对应的数据库
//以mysql为例
Configure<AbpDbContextOptions>(options =>
{
options.UseMySQL();
});
//3、加载AutoMapper到IOC容器
context.Services.AddAutoMapperObjectMapper<Abp_ServerContext>();
//3.1、 配置AutoMapper
Configure<AbpAutoMapperOptions>(options =>
{
//对整个项目进行映射
options.AddMaps<ABP_vNext_Shop_Module>();
});
//4、配置自动API控制器生成
Configure<AbpAspNetCoreMvcOptions>(options =>
{
//4.1、开启自动API控制器 => 集成整个项目所有控制器
options.ConventionalControllers.Create(typeof(ABP_vNext_Shop_Module).Assembly, options =>
{
//自定义指定 自动生成的api路由的项目名称
options.RootPath = "ABP_vNext_Shop";
////自动api都创建,为true不过滤,为false全部过滤
////非特殊特情况,不要使用这种方式,会写死
//options.TypePredicate = type => true;
});
});
//6.1、添加身份验证
context.Services.AddAuthentication().AddCookie();
//6.2、添加权限验证
context.Services.AddAuthorization();
//6.2.1、去除所有权限
context.Services.AddAlwaysAllowAuthorization();
//7、如果自定义了Identity用户模块数据库表的前缀,访问数据库也需要指定前缀
AbpIdentityDbProperties.DbTablePrefix = "Sys_";
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
//获取app
var app = context.GetApplicationBuilder();
//获取环境
var env = context.GetEnvironment();
app.UseSwagger();
app.UseAbpSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "api API");
});
app.UseStaticFiles();
app.UseHttpsRedirection();
app.UseAuthorization();
}
}
}
2、在Abp_ServerContext上下文中添加迁移文件配置
using ABP_vNext_Shop.Models;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Identity;
using Volo.Abp.Identity.EntityFrameworkCore;
namespace ABP_vNext_Shop.Context
{
/// <summary>
/// 数据库上下文类
/// [ConnectionStringName("Default")] 特性: 指定数据库连接字符串
/// </summary>
[ConnectionStringName("Default")]
public class Abp_ServerContext : AbpDbContext<Abp_ServerContext>
{
public Abp_ServerContext(DbContextOptions<Abp_ServerContext> options) : base(options)
{
}
public DbSet<Users> Users { get; set; }
/// <summary>
/// 根据模型创建表,进一步创建迁移文件
///
/// 如果需要给abp封装的表添加字段,需要自定义实体类集成对应表,按照 上面Users这种方法,手动添加到数据库
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
////自定义生成Identity用户模块数据库表的前缀
//AbpIdentityDbProperties.DbTablePrefix = "Sys_";
//根基Abp的 Identity生成对应的数据库迁移文件
modelBuilder.ConfigureIdentity();
}
}
}
3、使用cmd命令运行迁移文件生成数据库
3.1 生成迁移文件命令: dotnet ef add 迁移文件名称 -c 指定要迁移的上下文Dbcontext
3.2 把迁移文件生成到数据库命令:dotnet ef update 数据库名称 -c 指定要迁移的上下文Dbcontext
4、ABP封装的用户身份模块的数据库数据表
5、ABP封装的用户身份模块接口
到这里ABP_vNext框架:集成Identity用户身份模块就完成了!!!