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

我正在研究 .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 应用程序。

存储库项目是我的整个应用程序逻辑存在的地方,包括接口及其实现。存储库模式被注入到 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;,并且应用程序像专业人士一样运行。但是当我取消注释这部分时,错误再次出现。我仍然很好奇它以这种方式发生的原因?有什么想法吗?

标签: asp.net-core asp.net-core-mvc asp.net-identity asp.net-core-webapi repository-pattern


【解决方案1】:

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

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

services.AddDbContext<ApplicationContext>();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-05
    • 2021-10-05
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    相关资源
    最近更新 更多