如何按照存储库模式在 Asp.Net Core 5.0 项目上实施 .Net Core Identity?

How To Implement .Net Core Identity on Asp.Net Core 5.0 Project Following Repository Pattern?

我正在研究 .Net Core 5.0 技术,我目前的项目结构如下(在同一个解决方案中):

  1. Asp.Net 核心 5.0 Web API 项目
  2. Asp.Net 面向管理员用户的核心 5.0 Web 应用程序项目(客户端)
  3. Asp.Net 超级管理员核心 5.0 Web 应用程序项目(客户端)
  4. Asp.Net Core 5.0 Class 库(对于存储库模式)

Web API 项目只是一个 API 项目,它将通过为数据库操作(Crud 操作)提供资源来响应 Admin/Super 管理客户端应用程序。

存储库项目是我的整个应用程序逻辑所在的地方,包括接口及其实现。存储库模式注入 API 控制器,其中控制器方法使用存储库项目的 UnitOfWork 模式执行特定操作。

我已经实现了 .Net 核心标识(不是脚手架标​​识,我刚刚从 IdentityDbContext 继承了存储库模式的 ApplicationContext class,同时传递了自定义 AppliationUser class 到它)在存储库项目上,即使在 运行 首次迁移代码以添加身份 tables 和自定义 IdentityUser 之后,一切工作正常。

我想要实现的是在我的两个客户端应用程序(对于管理员和超级管理员门户)上使用身份脚手架,以允许超级管理员添加角色并将用户分配给这些角色。

通过管理门户,我将允许管理员管理他们自己的用户。

但是,我在处理每个管理员和超级管理员门户上的 startup.cs 部分时遇到了问题。我只想在 Repository Project 上使用 ApplicationContext.cs class 来进行所有与数据库相关的操作。但是,搭建身份(在超级管理员门户上会导致创建一个数据文件夹,其中包含一个单独的 AppliationDbContext.cs class 和迁移文件夹)并且管理员门户很可能就是这种情况(我没有在管理门户上试试)。

注意:我已经使用命令行界面 (CMD) 在超级管理员门户上搭建了标识,因为当我尝试通过右键单击项目并选择添加脚手架来搭建标识时,VS19 会抛出错误)。

我现在需要的是像角色 table 一样使用身份 table 来允许超级管理员创建新角色。但是当我尝试 运行 我的项目并执行超级管理员创建角色的代码时,它在 popup/alert 框中向我显示错误 window 说:

这是我使用 ajax 调用我的 API 项目来保存角色的代码:

function SaveRole() {
        
        var roleName = $('#roleName').val();

        $.ajax({
            url: APIHost + 'api/SuperAdmin/AddNewRole',
            data: JSON.stringify(roleName),
            type: 'POST',
            contentType: 'application/json;charset=utf-8',
            dataType: 'json',
            success: function (result) {
                if (result) {
                    $("#closeNewRoleModal").click();
                }
            },
            error: function (errormessage) {
                alert(errormessage.responseText);
            }
        });
    }

和API超级管理员控制器代码:

    [Route("api/SuperAdmin")]
        [ApiController]
        public class SuperAdminController : ControllerBase
        {
            private readonly IUnitOfWork _unitOfWork;
            private RoleManager<IdentityRole> _roleManager;
            private UserManager<ApplicationUser> _userManager;
            public SuperAdminController(IUnitOfWork unitOfWork, RoleManager<IdentityRole> roleManager, UserManager<ApplicationUser> userManager)
            {
                _unitOfWork = unitOfWork;
                _roleManager = roleManager;
                _userManager = userManager;
            }
    
            [HttpPost]
            [Route("AddNewRole")]
            public async Task<IActionResult> AddNewRole(string role)
            {
    
                await _roleManager.CreateAsync(new IdentityRole(role));
                  
                return new JsonResult(true);
            }
       }

更新:

我已经删除了身份支架添加的数据文件夹和迁移文件夹。在我的超级管理员门户的 startup.cs class 上,我在 ConfigureServices 方法上执行此操作:

services.AddDbContext<ApplicationContext>();
            services.AddIdentity<ApplicationUser, IdentityRole>()
                    .AddEntityFrameworkStores<ApplicationContext>()
                    .AddDefaultTokenProviders();

请注意,ApplicationContext 是我用于数据库操作的存储库项目中的实际上下文 class,它继承自 IdentityDbContxt 基础 class。

完全避开超级管理员门户的 startup.cs class 是我的错误。我认为每个应用程序都会使用 API 项目的 startup.cs class。

我在管理门户 startup.cs class 的 ConfigureServices 方法中加入了以下代码,问题已解决:

services.AddDbContext<ApplicationContext>();

services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationContext>()
        .AddDefaultTokenProviders()
        .AddDefaultUI();