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

В чем разница в использовании 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

4b9b3361

Ответ 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.