Подтвердить что ты не робот

Измените базу данных, в которой ASP.NET Identity хранит пользовательские данные

Мы создали новый проект ASP.NET 4.5.1 следующим образом:

  • Visual Studio 2013
  • Новый проект
  • Visual С#
  • Веб
  • Веб-приложение ASP.NET
  • Веб-интерфейс
  • Изменить аутентификацию
  • Индивидуальные учетные записи пользователей
  • Хорошо > Хорошо

В файле explorer > App_Start > Startup.Auth.cs есть следующий код, который настраивает indentity ASP.NET. Как изменить базу данных, в которой UserManager хранит пользовательские данные?

static Startup()
{
    PublicClientId = "self";

    UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());

    OAuthOptions = new OAuthAuthorizationServerOptions
    {
        TokenEndpointPath = new PathString("/Token"),
        Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
        AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
        AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
        AllowInsecureHttp = true
    };
}
4b9b3361

Ответ 1

Кроме того, о чем упоминалось @ta.speot.is и @Shaun: вы также можете передать имя строки соединения (хранящейся в файле web.config) в своем контексте в базовый конструктор в IdentityDbContext

public class MyDbContext : IdentityDbContext<MyUser>
{
  public MyDbContext()
    : base("TheNameOfTheConnectionString")
  {
  }
}

Этот учебник содержит обширный пример.

Другим способом было бы использовать имя строки подключения в качестве параметра вашего конструктора контекста и передать его базовому конструктору.

Ответ 2

Передайте свой собственный DbContext в конструктор UserStore или измените строку подключения Web.config с именем DefaultConnection. В любом случае комментарии @ta.speot.is верны.

Правильно

// do this - it the factory pattern
UserManagerFactory 
= () => new UserManager<IdentityUser>(new UserStore<IdentityUser>(new MyDbContext()));

Некорректное

// do NOT do this - use the preceding code. 
var userStore = new UserStore<IdentityUser>(new MyDbContext());                       
var userManager = new UserManager<IdentityUser>(userStore);
UserManagerFactory = () => userManager;

Подробнее

Класс UserStore предоставляет очень простой пользовательский интерфейс api. В коде мы настраиваем его для хранения пользовательских данных типа IdentityUser в хранилище данных MyDbContext.

Класс UserManager предоставляет более высокий уровень управления пользователями api, который автоматически сохраняет изменения в UserStore. В коде мы настраиваем его на использование UserStore, которое мы только что создали.

UserManagerFactory должен реализовать шаблон factory, чтобы получить один экземпляр UserManager для каждого запроса для приложения. В противном случае вы получите следующее исключение:

Контекст не может использоваться, пока модель создается. Это исключение может быть выбрано, если контекст используется внутри метода OnModelCreating или если тот же экземпляр контекста доступ к нескольким потокам одновременно. Обратите внимание, что члены экземпляра DbContext и связанные классы не гарантируются как поток сейф.

Что все.