首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将用户管理器包含到ASP.NET核心3.1的另一个应用程序中

如何将用户管理器包含到ASP.NET核心3.1的另一个应用程序中
EN

Stack Overflow用户
提问于 2020-04-07 17:42:16
回答 2查看 2.7K关注 0票数 1

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

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

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

我想实现的所有功能都可以由UserManager来实现(参见下面链接https://learn.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-3.1&tabs=visual-studio#disable-register-page中的“使用另一个应用程序添加用户”一节)。

基于此,我实现了以下代码:

代码语言:javascript
运行
复制
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来管理另一个应用程序的用户吗?

EN

回答 2

Stack Overflow用户

发布于 2020-04-07 19:01:51

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

您可以特别为它添加一个注册:

代码语言:javascript
运行
复制
services.AddScoped<UserManager<ApplicationUser>>();

然而,它实际上有大量的依赖项,每个依赖项都需要注册。如果您查看构造函数,就会发现有七个服务没有在框内注册,其中许多服务都有自己的依赖树。又长又短,是一种痛苦。这里还有分离关注点的问题。这需要从另一个应用程序中添加整个数据层。

您最好的选择是简单地在身份应用程序上公开一个API (当然,还可以锁定它)。这样,与用户一起工作的所有逻辑都与该逻辑的其余部分保持一致。然后,管理应用程序可以调用API来添加、更新、删除等用户,而不必知道这是如何实现的。

票数 2
EN

Stack Overflow用户

发布于 2022-11-06 19:02:02

两年后回答。对于未来的读者,您可以使用

代码语言:javascript
运行
复制
 services.AddIdentityCore<IdentityUser>();

它添加必要的服务,用于用户管理、添加/删除等,而不添加登录服务。

要添加EntityFramework,可以创建上下文并像这样使用

代码语言:javascript
运行
复制
 services.AddDbContext<ApplicationAuthDbContext>(options =>
 {
    // Configure the context to use postgresql.
    options.UseNpgsql(config.GetConnectionString("AuthDbContext"))
     .UseSnakeCaseNamingConvention();
 });
 
services.AddIdentityCore<IdentityUser>()
   .AddEntityFrameworkStores<ApplicationAuthDbContext>();

了解更多信息

https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.identityservicecollectionextensions.addidentitycore?view=aspnetcore-6.0

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61086125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档