ASP.NET Core 标识不注入 UserManager<ApplicationUser>

Posted

技术标签:

【中文标题】ASP.NET Core 标识不注入 UserManager<ApplicationUser>【英文标题】:ASP.NET Core Identity does not inject UserManager<ApplicationUser> 【发布时间】:2022-01-12 22:16:17 【问题描述】:

我有一个较旧的 asp.net 核心身份数据库,我想将一个新项目(一个 web api)映射到它。

为了测试,我从上一个项目中复制了 Models 文件夹和 ApplicationUser 文件(ApplicationUser 只是继承自 IdentityUser,没有任何更改)——首先做 DB 似乎是个坏主意。

我正在 ConfigureServices 中注册身份(但我没有将其添加到管道中,因为我唯一的目的是使用 UserStore)

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

我的期望是现在

     UserManager<ApplicationUser>

...应该自动注入到构造函数中。

但是,当将以下代码添加到控制器时 私有用户管理器_userManager;

    public UserController(UserManager<ApplicationUser> userManager)
    
        _userManager = userManager;
    

... 对 api 的每次调用都以异常结束: HttpRequestException:响应状态码不表示成功:500(内部服务器错误)。

删除“注入”代码会导致可以接受请求的 Web api 顺利运行。

很难调试,因为这发生在我的任何代码到达之前。知道为什么会这样吗?

附:从“异常设置”窗口启用所有异常后,我得到了这个:

抛出异常:中的“System.InvalidOperationException” Microsoft.Extensions.DependencyInjection.dll

附加信息:无法解析服务类型 'Namespace.Data.ApplicationDbContext' 尝试激活时 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4 [命名空间.模型。 ApplicationUser,Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole,Namespace.Data.ApplicationDbContext,System.String]'。

【问题讨论】:

添加完整服务器错误 当我遇到这个错误时,问题是我的 ApplicationDbContext 不是从 IdentityDbContext 派生的。它只是从没有通用类型 ApplicationUser 的 IdentityDbContext 派生而来的。 【参考方案1】:

Configure 方法中是否有 app.UseIdentity(); 调用:

 public void Configure(IApplicationBuilder app, 
                       IHostingEnvironment env, ILoggerFactory loggerFactory)
    
        /*...*/
        app.UseIdentity();
       /*...*/          
    

编辑 services.AddIdentity&lt;ApplicationUser, IdentityRole&gt;() 行之前是否也有这一行?

 public void ConfigureServices(IServiceCollection services)
 
        // Add framework services.
        services.AddDbContext<ApplicationDbContext>(options =>
             options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

 

这应该可以正常工作。另外请检查ApplicationDbContext是否继承自IdentityDbContext

【讨论】:

我在上面提到我没有(因为我不打算将它用于身份验证 - 仅用于用户存储)。然而,即使在实验性地添加它之后,结果也是一样的。 您的编辑修复了它,现在我很尴尬。我会在剩下的时间里隐藏我的脸...... Mihail 提到添加 app.UseIdentity()。这在 CORE 2.0 中已被弃用。现在的方法是 app.UseAuthentication()。希望这会有所帮助。 UseAuthentication() 似乎也没有注册这些经理。 如果我不使用数据库上下文怎么办?【参考方案2】:

DI 容器无法解析依赖项。将其添加到服务集合中

services.AddTransient<UserManager<ApplicationUser>>();
services.AddTransient<ApplicationDbContext>();

您还应该熟悉official documentation

【讨论】:

正是这个文档声称在使用 services.AddIdentity() 后一切都可以通过 DI 获得,不幸的是它不起作用。尝试了这个解决方案,除了在 UserStore 构造函数中添加临时用户存储、密码验证器和所有可见的依赖项 - 仍然没有。 好的,明白了。您能否添加问题的minimal reproducible example,以便我们可以重现您的问题并能够提供更好的答案【参考方案3】:
public void ConfigureServices(IServiceCollection services)
...
var identityBuilder = services.AddIdentityCore<ApplicationUser>(user =>
            
                // configure identity options
                user.Password.RequireDigit = true;
                user.Password.RequireLowercase = false;
                user.Password.RequireUppercase = false;
                user.Password.RequireNonAlphanumeric = false;
                user.Password.RequiredLength = 6;
            );
            identityBuilder = new IdentityBuilder(identityBuilder.UserType, typeof(IdentityRole), identityBuilder.Services);
            identityBuilder.AddEntityFrameworkStores<DbContext>().AddDefaultTokenProviders();
    ...

【讨论】:

以上是关于ASP.NET Core 标识不注入 UserManager<ApplicationUser>的主要内容,如果未能解决你的问题,请参考以下文章

[Asp.Net Core]Autofac单抽象多实现构造函数注入

[Asp.Net Core]Autofac单抽象多实例属性注入

[Asp.Net Core]Autofac单抽象多实例属性注入

ASP.Net Core MVC 依赖注入不起作用

ASP.NET Core 依赖注入基本用法

asp.net core自定义依赖注入容器,替换自带容器