我正在开发两种不同的应用程序,我将把它们命名为A和B。
创建新用户帐户后,我希望能够实现不同的功能,例如向挂号邮件地址发送电子邮件,以便新用户可以更改默认密码。
我想实现的所有功能都可以由UserManager来实现(参见下面链接https://learn.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-3.1&tabs=visual-studio#disable-register-page中的“使用另一个应用程序添加用户”一节)。
基于此,我实现了以下代码:
public class ControllerClass : Controller
{
private readonly HelperClass _helper;
private readonly UserManager<IdentityUser> _userManager;
public ControllerClass (UserManager<IdentityUser> userManager)
{
_userManager = userManager;
_helper= new HelperClass (userManager);
}
}
public class HelperClass
{
private readonly DbContext _db;
private readonly UserManager<IdentityUser> _userManager;
public HelperClass (UserManager<IdentityUser> userManager)
{
_db = new DbContext ();
_userManager = userManager;
}
private async Task<string> EnsureUser(string userName, string userPassword)
{
var user = await _userManager.FindByNameAsync(userName);
if (user == null)
{
user = new IdentityUser()
{
UserName = userName
};
await _userManager.CreateAsync(user, userPassword);
}
return user.Id;
}
internal async void CreateUser(UserVM uvm, int id)
{
var userId = await EnsureUser(uvm.userName, uvm.userPassword);
// TODO ...
}
}不幸的是,我未能将UserManager包含到我的应用程序B中。我收到了以下错误消息:“在处理请求时发生了一个未处理的异常。InvalidOperationException:在试图激活'ControllerClass‘时无法解析类型ControllerClass的服务。”
您知道,我如何添加UserManager来管理另一个应用程序的用户吗?
发布于 2020-04-07 19:01:51
嗯,您所得到的具体错误仅仅是因为UserManager<TUser>没有在服务集合中注册。为了注入任何东西,您必须先注册它。在实际面向用户的应用程序中,这是由services.AddIdentity()完成的。然而,这不仅仅是注册UserManager<TUser>,所以您不应该只运行并将相同的命令添加到第二个应用程序中。
您可以特别为它添加一个注册:
services.AddScoped<UserManager<ApplicationUser>>();然而,它实际上有大量的依赖项,每个依赖项都需要注册。如果您查看构造函数,就会发现有七个服务没有在框内注册,其中许多服务都有自己的依赖树。又长又短,是一种痛苦。这里还有分离关注点的问题。这需要从另一个应用程序中添加整个数据层。
您最好的选择是简单地在身份应用程序上公开一个API (当然,还可以锁定它)。这样,与用户一起工作的所有逻辑都与该逻辑的其余部分保持一致。然后,管理应用程序可以调用API来添加、更新、删除等用户,而不必知道这是如何实现的。
发布于 2022-11-06 19:02:02
两年后回答。对于未来的读者,您可以使用
services.AddIdentityCore<IdentityUser>();它添加必要的服务,用于用户管理、添加/删除等,而不添加登录服务。
要添加EntityFramework,可以创建上下文并像这样使用
services.AddDbContext<ApplicationAuthDbContext>(options =>
{
// Configure the context to use postgresql.
options.UseNpgsql(config.GetConnectionString("AuthDbContext"))
.UseSnakeCaseNamingConvention();
});
services.AddIdentityCore<IdentityUser>()
.AddEntityFrameworkStores<ApplicationAuthDbContext>();了解更多信息
https://stackoverflow.com/questions/61086125
复制相似问题