2017-06-11 55 views
9

Otrzymuję ten błąd w kontrolerze logowania.Nie można rozwiązać usługi dla typu "Microsoft.AspNetCore.Identity.UserManager` podczas próby aktywacji" AuthController "

InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Identity.UserManager`1[Automobile.Models.Account]' while attempting to activate 'Automobile.Server.Controllers.AuthController'.

tutaj jest konstruktor Auth Controller:

private SignInManager<Automobile.Models.Account> _signManager; 
    private UserManager<Automobile.Models.Account> _userManager; 

    public AuthController(UserManager<Models.Account> userManager, 
          SignInManager<Automobile.Models.Account> signManager) 
    { 
     this._userManager = userManager; 
     this._signManager = signManager; 
    } 

i tu jest ConfigureServices w startup.cs:

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddApplicationInsightsTelemetry(Configuration); 
     services.Configure<AppConfig>(Configuration.GetSection("AppSettings")); 

     //var provider = HttpContext.ApplicationServices; 
     //var someService = provider.GetService(typeof(ISomeService)); 


     services.AddDbContext<Providers.Database.EFProvider.DataContext>(options => options 
      .UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), 
       b => b.MigrationsAssembly("Automobile.Server") 
      )); 


     services.AddIdentity<IdentityUser, IdentityRole>(options => 
     { 
      options.User.RequireUniqueEmail = false; 
     }) 
     .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() 
     .AddDefaultTokenProviders(); 
     //services.AddScoped<SignInManager<Automobile.Models.Account>, SignInManager<Automobile.Models.Account>>(); 
     //services.AddScoped<UserManager<Automobile.Models.Account>, UserManager<Automobile.Models.Account>>(); 

     services.AddMvc(); 
     App.Service = services.BuildServiceProvider(); 

     // Adds a default in-memory implementation of IDistributedCache. 
     services.AddDistributedMemoryCache(); 

     services.AddSession(options => 
     { 
      // Set a short timeout for easy testing. 
      options.IdleTimeout = TimeSpan.FromSeconds(10); 
      options.CookieHttpOnly = true; 
     }); 

    } 
+11

Wydaje mi się, że rejestrujesz 'IdentityUser' jako podstawową klasę użytkownika, ale używasz' Automobile.Models.Account', która, oczywiście, nie jest zarejestrowana nigdzie przez ASP.NET Identity –

+0

@FedericoDipuma Dziękujemy tak bardzo :) Rozwiązany. – OMID

+0

Jak to rozwiązałeś ..? – Lobato

Odpowiedz

4

Trzeba korzystać z tego samego modelu danych użytkownika w SignInManager, UserManager i services.AddIdentity. Ta sama zasada obowiązuje wtedy, gdy używasz własnej niestandardowej klasy modelu roli aplikacji.

więc zmienić

services.AddIdentity<IdentityUser, IdentityRole>(options => 
    { 
     options.User.RequireUniqueEmail = false; 
    }) 
    .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() 
    .AddDefaultTokenProviders(); 

do

services.AddIdentity<Automobile.Models.Account, IdentityRole>(options => 
    { 
     options.User.RequireUniqueEmail = false; 
    }) 
    .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() 
    .AddDefaultTokenProviders(); 
+0

Mam podobny problem, mam mój klient i rola zdefiniowana w metodzie AddIdentity i nadal otrzymuję ten sam błąd. Każdy pomysł, dlaczego? Mogę opublikować mój kod w osobnym wątku. – devC

+0

proszę wpisać swój kod. – HojjatK

+0

W rzeczywistości rozwiązałem ten problem, ale teraz mam problem z utworzeniem połączenia DB. Opublikuję problem. – devC

1

Wystarczy być jasne, o odpowiedź:

Jeśli użyć klasy ApplicationUser w startup.cs: services.AddIdentity<ApplicationUser, IdentityRole>()

następnie musisz użyć tej samej klasy w kontrolerze, kiedy i njecting go:

public AccountController(UserManager<ApplicationUser> userManager) 

Jeśli użyć innej klasy, takie jak:

public AccountController(UserManager<IdentityUser> userManager) 

następnie otrzymasz ten błąd:

InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Identity.UserManager`1[IdentityUser]' 

ponieważ użyłeś ApplicationUser przy starcie, a nie IdentityUser tak ten typ nie jest zarejestrowany w systemie iniekcyjnym.