如何按照存储库模式在 Asp.Net Core 5.0 项目上实施 .Net Core Identity?
How To Implement .Net Core Identity on Asp.Net Core 5.0 Project Following Repository Pattern?
我正在研究 .Net Core 5.0 技术,我目前的项目结构如下(在同一个解决方案中):
- Asp.Net 核心 5.0 Web API 项目
- Asp.Net 面向管理员用户的核心 5.0 Web 应用程序项目(客户端)
- Asp.Net 超级管理员核心 5.0 Web 应用程序项目(客户端)
- Asp.Net Core 5.0 Class 库(对于存储库模式)
Web API 项目只是一个 API 项目,它将通过为数据库操作(Crud 操作)提供资源来响应 Admin/Super 管理客户端应用程序。
存储库项目是我的整个应用程序逻辑所在的地方,包括接口及其实现。存储库模式注入 API 控制器,其中控制器方法使用存储库项目的 UnitOfWork
模式执行特定操作。
我已经实现了 .Net 核心标识(不是脚手架标识,我刚刚从 IdentityDbContext
继承了存储库模式的 ApplicationContext class,同时传递了自定义 AppliationUser
class 到它)在存储库项目上,即使在 运行 首次迁移代码以添加身份 tables 和自定义 IdentityUser 之后,一切工作正常。
我想要实现的是在我的两个客户端应用程序(对于管理员和超级管理员门户)上使用身份脚手架,以允许超级管理员添加角色并将用户分配给这些角色。
通过管理门户,我将允许管理员管理他们自己的用户。
但是,我在处理每个管理员和超级管理员门户上的 startup.cs 部分时遇到了问题。我只想在 Repository Project 上使用 ApplicationContext.cs
class 来进行所有与数据库相关的操作。但是,搭建身份(在超级管理员门户上会导致创建一个数据文件夹,其中包含一个单独的 AppliationDbContext.cs
class 和迁移文件夹)并且管理员门户很可能就是这种情况(我没有在管理门户上试试)。
注意:我已经使用命令行界面 (CMD) 在超级管理员门户上搭建了标识,因为当我尝试通过右键单击项目并选择添加脚手架来搭建标识时,VS19 会抛出错误)。
我现在需要的是像角色 table 一样使用身份 table 来允许超级管理员创建新角色。但是当我尝试 运行 我的项目并执行超级管理员创建角色的代码时,它在 popup/alert 框中向我显示错误 window 说:
这是我使用 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超级管理员控制器代码:
[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);
}
}
更新:
我已经删除了身份支架添加的数据文件夹和迁移文件夹。在我的超级管理员门户的 startup.cs
class 上,我在 ConfigureServices
方法上执行此操作:
services.AddDbContext<ApplicationContext>();
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationContext>()
.AddDefaultTokenProviders();
请注意,ApplicationContext
是我用于数据库操作的存储库项目中的实际上下文 class,它继承自 IdentityDbContxt
基础 class。
完全避开超级管理员门户的 startup.cs class 是我的错误。我认为每个应用程序都会使用 API 项目的 startup.cs class。
我在管理门户 startup.cs class 的 ConfigureServices 方法中加入了以下代码,问题已解决:
services.AddDbContext<ApplicationContext>();
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationContext>()
.AddDefaultTokenProviders()
.AddDefaultUI();
我正在研究 .Net Core 5.0 技术,我目前的项目结构如下(在同一个解决方案中):
- Asp.Net 核心 5.0 Web API 项目
- Asp.Net 面向管理员用户的核心 5.0 Web 应用程序项目(客户端)
- Asp.Net 超级管理员核心 5.0 Web 应用程序项目(客户端)
- Asp.Net Core 5.0 Class 库(对于存储库模式)
Web API 项目只是一个 API 项目,它将通过为数据库操作(Crud 操作)提供资源来响应 Admin/Super 管理客户端应用程序。
存储库项目是我的整个应用程序逻辑所在的地方,包括接口及其实现。存储库模式注入 API 控制器,其中控制器方法使用存储库项目的 UnitOfWork
模式执行特定操作。
我已经实现了 .Net 核心标识(不是脚手架标识,我刚刚从 IdentityDbContext
继承了存储库模式的 ApplicationContext class,同时传递了自定义 AppliationUser
class 到它)在存储库项目上,即使在 运行 首次迁移代码以添加身份 tables 和自定义 IdentityUser 之后,一切工作正常。
我想要实现的是在我的两个客户端应用程序(对于管理员和超级管理员门户)上使用身份脚手架,以允许超级管理员添加角色并将用户分配给这些角色。
通过管理门户,我将允许管理员管理他们自己的用户。
但是,我在处理每个管理员和超级管理员门户上的 startup.cs 部分时遇到了问题。我只想在 Repository Project 上使用 ApplicationContext.cs
class 来进行所有与数据库相关的操作。但是,搭建身份(在超级管理员门户上会导致创建一个数据文件夹,其中包含一个单独的 AppliationDbContext.cs
class 和迁移文件夹)并且管理员门户很可能就是这种情况(我没有在管理门户上试试)。
注意:我已经使用命令行界面 (CMD) 在超级管理员门户上搭建了标识,因为当我尝试通过右键单击项目并选择添加脚手架来搭建标识时,VS19 会抛出错误)。
我现在需要的是像角色 table 一样使用身份 table 来允许超级管理员创建新角色。但是当我尝试 运行 我的项目并执行超级管理员创建角色的代码时,它在 popup/alert 框中向我显示错误 window 说:
这是我使用 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超级管理员控制器代码:
[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);
}
}
更新:
我已经删除了身份支架添加的数据文件夹和迁移文件夹。在我的超级管理员门户的 startup.cs
class 上,我在 ConfigureServices
方法上执行此操作:
services.AddDbContext<ApplicationContext>();
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationContext>()
.AddDefaultTokenProviders();
请注意,ApplicationContext
是我用于数据库操作的存储库项目中的实际上下文 class,它继承自 IdentityDbContxt
基础 class。
完全避开超级管理员门户的 startup.cs class 是我的错误。我认为每个应用程序都会使用 API 项目的 startup.cs class。
我在管理门户 startup.cs class 的 ConfigureServices 方法中加入了以下代码,问题已解决:
services.AddDbContext<ApplicationContext>();
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationContext>()
.AddDefaultTokenProviders()
.AddDefaultUI();