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

Posted

技术标签:

【中文标题】如何按照存储库模式在 Asp.Net Core 5.0 项目上实现 .Net Core Identity?【英文标题】:How To Implement .Net Core Identity on Asp.Net Core 5.0 Project Following Repository Pattern? 【发布时间】:2021-09-01 09:23:58 【问题描述】:

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

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

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

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

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

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

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

但是,我在处理每个管理员和超级管理员门户上的 startup.cs 部分时都遇到了问题。我确实只想将存储库项目上的 ApplicationContext.cs 类用于所有与数据库相关的操作。但是,脚手架身份(在超级管理员门户上会导致创建一个带有单独的 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 Controller 代码:

    [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 基类。

【问题讨论】:

在 Repository Project 中使用实际的上下文类后,您是否遇到任何错误? @YiyiYou 在使用存储库项目中的实际上下文类时,我没有收到任何错误。我什至从 Super Admin Portal 上的 startup.cs 类中删除了上下文部分,以允许应用程序使用存储库项目中的实际上下文类,但没有任何成功。 @YiyiYou 我重新创建了超级管理员门户,使用 CMD 搭建了 Identity,同时我评论了代码部分 &lt;partial name="_LoginPartial" /&gt;,并且应用程序像专业人士一样运行。但是当我取消注释这部分时,错误再次出现。我仍然很好奇它以这种方式发生的原因?有什么想法吗? 【参考方案1】:

我完全避免了超级管理员门户的 startup.cs 类是我的错误。我以为每个应用程序都会使用 API Project 的 startup.cs 类。

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

services.AddDbContext<ApplicationContext>();

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

【讨论】:

以上是关于如何按照存储库模式在 Asp.Net Core 5.0 项目上实现 .Net Core Identity?的主要内容,如果未能解决你的问题,请参考以下文章

在使用 IdentityDbContext 的情况下,如何在 ASP.NET Core MVC 中使用存储库模式?

Asp.net Core - 通用存储库模式 - 使用 TrimStart 搜索

如何从 ASP.NET Core 3.1 中的存储库类创建确认电子邮件回调

asp.net core, Ef core : 在运行时动态映射存储库和服务

如何使用 asp.net 核心中的依赖注入在工作单元模式中延迟注入存储库

如何在 ASP.NET Core 中保持对象活动?