1

我正在开发两个不同的应用程序,我将它们命名为 A 和 B。

  • A 是一个互联网平台,只有拥有有效用户帐户才能登录。
  • B 是一个 Intranet 平台,用户可以在其中通过 Active Directory 进行身份验证。使用应用程序 B 的管理员应该能够为应用程序 A 创建新的用户帐户。

创建新用户帐户后,我希望能够实现不同的功能,例如向注册的邮件地址发送电子邮件,以便新用户可以更改默认密码。

我想要实现的所有功能都可以由UserManager完成(请参阅以下链接中的“使用另一个应用程序添加用户”部分:https ://docs.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:无法解析类型'Microsoft.AspNetCore.Identity.UserManager`1 的服务[IdentityUser]' 在尝试激活 'ControllerClass' 时。”

您有什么想法,我如何添加UserManager来管理另一个应用程序的用户?

4

1 回答 1

2

那么,你得到的具体错误仅仅是因为UserManager<TUser>没有在服务集合中注册。为了注入任何东西,你必须先注册它。在您实际面向用户的应用程序中,这是由services.AddIdentity(). 但是,这不仅仅是 register UserManager<TUser>,因此您不应该只是跑掉并将相同的命令添加到您的第二个应用程序。

您可以专门为其添加注册:

services.AddScoped<UserManager<ApplicationUser>>();

但是,它实际上有很多依赖项,每个依赖项需要注册。如果您查看构造函数,则有7 个服务没有开箱即用地注册,其中许多都有自己的依赖树。有长有短,很痛苦。这里还有关注点分离的问题。这需要从其他应用程序添加整个数据层。

最好的办法是简单地在 Identity 应用程序上公开一个 API(当然,将其锁定)。这样,与用户合作的所有逻辑都与该逻辑的其余部分保持一致。然后,管理应用程序可以调用 API 来添加、更新、删除等用户,而无需知道实际是如何完成的。

于 2020-04-07T19:01:51.683 回答