4

У меня есть старая базовая идентификационная база данных asp.net, и я хочу создать для нее новый проект (веб-api).Идентификатор ядра ASP.NET не вставляет UserManager <ApplicationUser>

Только для теста я скопировал папку «Модели» и файл 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 (Внутренняя ошибка сервера).

Удаление кода «инъекции» приводит к плавному запуску веб-api, который может принимать запросы.

Трудно отлаживать, поскольку это происходит до того, как какой-либо из моих кодов достигнут. Любая идея, почему это происходит?

P.S. После включения все исключения из окна настройки исключений Я получил это один:

Исключение брошено: «System.InvalidOperationException» в
Microsoft.Extensions.DependencyInjection.dll

Дополнительная информация: Не удается разрешить услугу type 'Namespace.Data.ApplicationDbContext' при попытке активировать 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4 [Пространство имен.Модели. ApplicationUser, Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole, пространство имен.Data.ApplicationDbContext, System.String] '.

+0

добавить полную ошибку –

ответ

4

У вас есть app.UseIdentity(); вызов метода Configure:

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

EDIT ли вы иметь эту линию перед services.AddIdentity<ApplicationUser, IdentityRole>() линии?

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

} 

Это должно работать нормально. Также проверьте, действительно ли ApplicationDbContext наследует от IdentityDbContext.

+0

сервера я уже упоминал выше, что я не сделал (так как я не собираюсь использовать его для аутентификации - только для пользователей). Однако, даже после добавления экспериментально результат тот же. – nikovn

+2

Ваше исправление исправлено, и теперь я смущен. Я скрою свое лицо до конца дня ... – nikovn

2

Коннектор DI не может решить проблему.Добавить его в коллекцию услуг

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

Вы должны также ознакомиться с official documentation

+0

Именно эта документация утверждает, что все доступно через DI после использования services.AddIdentity(), который не работает, к сожалению. Пробовал это решение, помимо добавления временных хранилищ пользователей, проверки паролей и всех видимых зависимостей в конструкторе UserStore - все равно ничего. – nikovn

+1

Хорошо понял. Можете ли вы добавить [mcve] проблемы, чтобы мы могли воспроизвести вашу проблему и быть в состоянии дать лучшие ответы – Nkosi

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