В чем разница в использовании UserStore и UserManager в Identity Asp.Net?
Я очень новичок в Asp.Net Identity и, пожалуйста, несите меня, если этот вопрос кажется глупым. Поэтому, когда я прочитал определение класса UserStore и класса UserManager на веб-сайте Microsoft, которые находятся в ссылках ниже, похоже, что оба класса определяют операции вокруг пользователей (например, Add, Find, Delete and Modify). Итак, когда я использую один над другим?:
https://msdn.microsoft.com/en-us/library/dn315446(v=vs.108).aspx
https://msdn.microsoft.com/en-us/library/dn613290(v=vs.108).aspx
Ответы
Ответ 1
Там все довольно сложно и могло быть проще.
UserManger
является... менеджером. Он не взаимодействует с хранилищем, базой данных.
Это то, что делает UserStore
.
Фактически у UserManager есть конструктор github.
Это UserManager. Как видите, там не так много. Всего несколько строк кода для настройки валидатора.
UserStore, наоборот, довольно большой. В этом примере я реализовал несколько интерфейсов и переопределил несколько методов.
Что бы вы сделали, если хотите настроить взаимодействие с базой данных и/или расширить свои классы.
Обычно вы не взаимодействуете с UserStore
и на самом деле скрыты. Вы просто создаете его и передаете его в UserManager
и... забудьте об этом.
Вы всегда можете настроить UserManager и открыть UserStore:
public class UserManager : UserManager<User, int>
{
public UserManager(IUserStore<User, int> store): base(store)
{
this.Store = store;
}
public IUserStore<User, int> Store { get; set; }
}
и, возможно, ovveride некоторые из методов:
public class UserManager : UserManager<User, int>
{
public UserManager(IUserStore<User, int> store): base(store)
{
this.Store = store;
}
public IUserStore<User, int> Store { get; set; }
public override System.Threading.Tasks.Task<IdentityResult> CreateAsync(User user)
{
return base.CreateAsync(user);
}
}
но это было бы бессмысленно, если только вам не придется выполнять какую-то особую настройку.
Предположим, вы хотите создать пользователя, использующего хранилище вместо менеджера. Вы можете сделать что-то вроде этого:
await this.UserManager.Store.CreateAsync(new Custom.Identity.User() { UserName = "LeftyX" });
и это сработает.
В вышеприведенном классе, как вы можете видеть, я переопределил CreateAsync
в UserManager.
Этот метод вызывает UserStore.CreateAsync()
, и на самом деле вам нужно вызвать базовый метод CreateAsync:
public override System.Threading.Tasks.Task<IdentityResult> CreateAsync(User user)
{
return base.CreateAsync(user);
}
Если вы этого не сделаете и, например, вернете нуль вместо этого, UserStore.CreateAsync
не будет вызван звонок, и пользователь не будет создан.
Это имеет смысл в конце.
Я думаю, что лучший способ понять, как работает эта среда - попробовать и настроить/реализовать свое решение с помощью собственного хранилища и посмотреть, как все классы взаимодействуют друг с другом.
Образец project не взаимодействует с базой данных, а использует json-хранилище. Это очень легко отлаживать. Дайте ему пойти, и в какой-то момент все будет яснее.
Ответ 2
Идентичность основана на двух первичных блоках в Identity ASP.NET. Существует менеджер проверки подлинности, который принимает форму класса UserManager<T>
. Существует также менеджер магазина, который является экземпляром UserStore<T>
.
разница?
Объект UserStore<T>
вводится в диспетчер аутентификации, который используется для идентификации и аутентификации идентификатора UserStore<T>
. Ссылка UserManager<T>
действует как аутентификатор для идентификатора UserStore<T>
.
Важная информация
Идентификатор ASP.NET основан на новейшем интерфейсе Open Web. Это означает, что [обычно] интерфейс IAuthenticationManager, указанный в Microsoft.Owin.Security
: Связанный здесь, аутентификатор вводится в класс UserManager
и контроллер и в основном каждая операция, которая включает в себя этап аутентификации.
В следующем:
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
var identity = await UserManager.CreateIdentityAsync(user,
DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties() {
IsPersistent = isPersistent }, identity);
}
Мы можем заметить, что диспетчер проверки подлинности UserManager
используется для проверки пользователя приложения "UserStore
" на идентификатор диспетчера проверки подлинности. Фрагмент из блога.
Заключение
UserManager
- это, по сути, логика домена вашей ASP.NET Identity. Контроллер, который вы используете для обработки "входа" или "идентификации", передается UserStore
, который как MSDN: Userstore изображает...
Представляет реализацию Entity Framework хранилища пользователей, которая поддерживает IUserStore, IUserLoginStore, IUserClaimStore и IUserRoleStore.
Как только UserStore
будет иметь все необходимые поля для идентификации в качестве идентификатора, и вы квалифицировали UserManager
в качестве диспетчера проверки подлинности и способ хранения контекста... aka IdentityDbContext
или какой-либо другой метод сохраняя значения в SQL (если используется), у вас будет система Identity, способная поддерживать логины.
Ответ 3
Я смотрел учебник Identity на YouTube, и я думаю, что этот снимок экрана может помочь:
![Managers vs Stores]()
Таким образом, UserManager - это фактический класс, с которым вы должны работать, но он не знает, как хранить и извлекать данные из базы данных. он даже не знает, куда будут поступать данные.
Для этих целей он использует UserStore и говорит ему, например: "Hey UserStore У меня есть новый пользователь, который нужно сохранить для будущего использования, я не знаю, где вы собираетесь его сохранить и как вы собираюсь сделать это, просто сохраните его для меня"
Затем UserStore выполняет фактическую работу, например, где должны сохраняться данные? какая база данных? и как? по умолчанию используется EF и SQL Server, поэтому, если вы хотите использовать какую-либо другую базу данных, например MySQL, вам понадобится другой UserStore.
Это одна из функций, которые были добавлены в Identity по сравнению с Membership, которые работали только с SQL Server.
Та же концепция применима для RoleManager и RoleStore.