首页 > 解决方案 > 如何按照存储库模式在 Asp.Net Core 5.0 项目上实现 .Net Core Identity?

问题描述

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

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

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

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

我已经在存储库项目上实现了.Net Core Identity(不是脚手架身份,我刚刚继承了存储库模式的ApplicationContext类,IdentityDbContext同时将自定义AppliationUser类传递给它),即使在运行代码首次迁移以添加身份表后一切正常并自定义 IdentityUser。

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

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

但是,我在处理每个管理员和超级管理员门户上的 startup.cs 部分时都遇到了问题。我确实只想将ApplicationContext.csRepository Project 上的类用于所有与数据库相关的操作。但是,脚手架身份(在超级管理员门户上会导致创建一个具有单独的AppliationDbContext.cs类和迁移文件夹的数据文件夹),并且很可能会在管理员门户上出现这种情况(我没有在管理员门户上尝试过)。

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

我现在需要的是使用像角色表这样的身份表来允许超级管理员创建新角色。但是当我尝试运行我的项目并执行超级管理员创建角色的代码时,它会在弹出/警报框窗口中显示一个错误:

在此处输入图像描述

这是我使用 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 SuperAdmin 控制器代码:

    [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);
            }
       }

更新:

我已删除 Identity Scaffolding 添加的数据文件夹和迁移文件夹。在startup.cs我的超级管理员门户的课堂上,我正在使用以下ConfigureServices方法:

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

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

标签: asp.net-coreasp.net-core-mvcasp.net-identityasp.net-core-webapirepository-pattern

解决方案


我完全避免了超级管理员门户的 startup.cs 类,这是我的错误。我认为每个应用程序都将使用 API 项目的 startup.cs 类。

我在管理门户的 startup.cs 类的 ConfigureServices 方法中包含以下代码,问题已解决:

services.AddDbContext<ApplicationContext>();

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

推荐阅读