如何按照存储库模式在 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,同时我评论了代码部分<partial name="_LoginPartial" />
,并且应用程序像专业人士一样运行。但是当我取消注释这部分时,错误再次出现。我仍然很好奇它以这种方式发生的原因?有什么想法吗?
【参考方案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 : 在运行时动态映射存储库和服务