asp.net-core - 如何按照存储库模式在 Asp.Net Core 5.0 项目上实现 .Net Core Identity?
问题描述
我正在研究 .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 应用程序。
存储库项目是我的整个应用程序逻辑存在的地方,包括接口及其实现。UnitOfWork
存储库模式被注入到 API 控制器上,其中控制器方法使用存储库项目的模式执行特定操作。
我已经在存储库项目上实现了.Net Core Identity(不是脚手架身份,我刚刚继承了存储库模式的ApplicationContext类,IdentityDbContext
同时将自定义AppliationUser
类传递给它),即使在运行代码首次迁移以添加身份表后一切正常并自定义 IdentityUser。
我想要实现的是在我的两个客户端应用程序(对于管理员和超级管理员门户)上使用身份脚手架,以便允许超级管理员添加角色并将用户分配给这些角色。
通过管理员门户,我将允许管理员管理他们自己的用户。
但是,我在处理每个管理员和超级管理员门户上的 startup.cs 部分时都遇到了问题。我确实只想将ApplicationContext.cs
Repository 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
基类继承的。
解决方案
我完全避免了超级管理员门户的 startup.cs 类,这是我的错误。我认为每个应用程序都将使用 API 项目的 startup.cs 类。
我在管理门户的 startup.cs 类的 ConfigureServices 方法中包含以下代码,问题已解决:
services.AddDbContext<ApplicationContext>();
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationContext>()
.AddDefaultTokenProviders()
.AddDefaultUI();
推荐阅读
- apache-spark - 拆分数据框中的文本并检查是否包含子字符串
- jdbc - 有没有办法在 EMR 中加载 install-interpreter.sh 文件以加载第 3 方解释器?
- android - 我的对话框片段中的复选框,选中后不会再次显示对话框
- javascript - 无法解析时间字符串
- powershell - Powershell 脚本完成但退出并出现错误代码 1
- laravel - 如何在另一个资源中处理 Laravel 资源?
- flutter - 如何在 Flutter 中显示 Apple MapKit 地图
- php - 向具有自定义状态的 WooCommerce 订单显示“完成”操作按钮
- c# - C# - 在类库中使用接口或依赖注入来优雅地替代 Switch 语句?
- pandas - 在每个标签的堆积条形图中设置颜色