ASP.NET Core Identity不会注入UserManager <applicationuser>

时间:2017-01-16 14:58:48

标签: c# asp.net-web-api asp.net-core asp.net-identity asp.net-core-mvc

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

仅仅为了测试,我复制了Models文件夹,以及上一个项目中的ApplicationUser文件(ApplicationUser只是继承自IdentityUser,没有任何变化) - 首先执行数据库似乎是一个坏主意。

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

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

我的期望是现在

     UserManager<ApplicationUser>

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

但是,将以下代码添加到控制器时         private UserManager _userManager;

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

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

删除&#34;注射&#34;代码可以顺利运行可以接受请求的web api。

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

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

  

抛出异常:&#39; System.InvalidOperationException&#39;在
  Microsoft.Extensions.DependencyInjection.dll

     

其他信息:无法解析类型服务   &#39; Namespace.Data.ApplicationDbContext&#39;在尝试激活时   &#39; Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4 [Namespace.Models。   ApplicationUser,Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole,Namespace.Data.ApplicationDbContext,System.String]&#39;

3 个答案:

答案 0 :(得分:7)

您是否使用app.UseIdentity();方法进行Configure调用:

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

修改    你还在services.AddIdentity<ApplicationUser, IdentityRole>()行之前有这一行吗?

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

 }

这应该可行。另请检查ApplicationDbContext是否继承自IdentityDbContext

答案 1 :(得分:4)

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

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

您还应该熟悉official documentation

答案 2 :(得分:0)

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();
    ...
}