Измените базу данных, в которой 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
};
}
Ответы
Ответ 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 и связанные классы не гарантируются как поток сейф.
Что все.