学习C#—ABP_vNext框架:第四章(集成Identity用户身份模块)

1,049 阅读5分钟

本文,代码继承自第三章内容往下继续写的,如果看不懂,请看第三章代码!

[学习C#—ABP vNext框架:第三章(使用DDD领域驱动设计实现.NetCoreApi项目) - 掘金 (juejin.cn)] (juejin.cn/post/726215…)

一、概念

  1. 用户(User):表示应用程序中的一个用户。每个用户都有一个唯一的标识符(UserID)和一组属性(如用户名、密码、电子邮件地址等)。

  2. 角色(Role):表示应用程序中的一种角色或权限。角色可以用于对不同的用户组施加不同的访问控制。每个角色都有一个唯一的标识符(RoleID)和一个角色名称。

  3. 身份(Identity):表示用户在应用程序中的身份和认证状态。用户可以通过身份提供者(如本地数据库、外部身份提供商如Google、Facebook等)进行认证,并获得一个身份凭证(如Cookie或令牌)。

  4. 声明(Claim):表示用户身份的附加信息,如姓名、邮件地址、角色等。声明可以用于在应用程序中对用户进行精细的权限控制。

  5. 用户存储(User Store):用于将用户和用户属性存储在持久化存储(如数据库)中的组件。可以使用默认的实现(如Entity Framework)或自定义实现。

  6. 角色存储(Role Store):用于将角色和角色属性存储在持久化存储中的组件。也可以使用默认的实现或自定义实现。

  7. 登录(Login):表示用户使用身份提供者进行身份验证的过程。登录会生成一个身份凭证(如Cookie或令牌)。

  8. 注册(Register):表示用户创建新帐户的过程。注册会创建一个新用户,并将其存储到用户存储中。

  9. 密码重置(Password Reset):表示用户重置密码的过程。可以通过电子邮件或安全问题等方式进行密码重置。

  10. 访问控制(Access Control):表示用户对应用程序资源的访问权限控制。可以使用角色、声明等进行精细的访问控制配置。

  11. 身份验证(Authentication):表示验证用户身份的过程,确保用户是合法和经过认证的。

  12. 授权(Authorization):表示在用户身份验证通过后,允许用户访问特定资源或执行特定操作的过程。

.NET Identity提供了一套易于使用和灵活的API,可以轻松管理用户身份和访问控制,并且可以与ASP.NET Core的其他功能(如认证中间件、授权策略等)无缝集成。

二、引入管理Nuget包

image.png

image.png

三、集成用户身份模块

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封装的用户身份模块的数据库数据表

image.png

5、ABP封装的用户身份模块接口

image.png

到这里ABP_vNext框架:集成Identity用户身份模块就完成了!!!