В чем разница в использовании UserStore и UserManager в Identity Asp.Net?

21

Я очень новичок в Asp.Net Identity и, пожалуйста, несите меня, если этот вопрос кажется глупым. Поэтому, когда я прочитал определение класса UserStore и класса UserManager на веб-сайте Microsoft, которые находятся в ссылках ниже, похоже, что оба класса определяют операции вокруг пользователей (например, Add, Find, Delete and Modify). Итак, когда я использую один над другим?:

Ссылка Ссылка

    
задан MinhNguyen 09.07.2015 в 08:48
источник
  • В терминах Driven Driven Design Usermanager - это уровень приложения, он координирует действие другого уровня, а userStorer - это уровень репозитория, он взаимодействует с базой данных, теперь предположим, что вы хотите отправить sms пользователю, вы не можете использовать userStore, поскольку его ответственность просто для выполнения задачи сохранения данных. но вы можете использовать userManager для отправки sms или другого действия. –  Arash 18.04.2016 в 12:19

3 ответа

31

Там все довольно сложно и могло быть проще.

UserManger является ... менеджером. Он не взаимодействует с хранилищем, базой данных. Это то, что делает UserStore .

Фактически UserManager имеет , Который нуждается в пользовательском хранилище.

Почему у вас должен быть отдельный объект для управления пользователями? Ну, основная причина заключается в том, что вы можете решить не использовать EF и создать свой собственный магазин пользователей.

Все становится понятнее, когда вы пытаетесь реализовать своего собственного поставщика хранилища. Я сделал это, и мой код можно загрузить из 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 не будет вызываться, и пользователь не будет создан.

Это имеет смысл в конце.

Я думаю, что лучший способ понять, как работает эта среда - попробовать и настроить / реализовать свое решение с помощью собственного хранилища и посмотреть, как все классы взаимодействуют друг с другом.

Образец проекта не взаимодействует с базой данных, а использует json-хранилище. Это очень легко отлаживать. Дайте ему пойти, и в какой-то момент все будет яснее.

    
ответ дан LeftyX 09.07.2015 в 18:05
  • Большое спасибо, у меня есть более четкое понимание моего вопроса. Но в ваших классах вы ставите все методы в класс UserStore. но, согласно веб-сайту MS, у них есть методы для операций с пользователем в UserStore и UserManager. Это разные методы, но почему они просто не помещают все в UserStore или UserManager, как ваш? Какова их цель для этого? –  MinhNguyen 09.07.2015 в 19:21
  • Upvote для более четкого ответа, чем мой долговязый ответ. –  Adam 09.07.2015 в 19:39
  • @Adam: Спасибо. Оценил. –  LeftyX 09.07.2015 в 19:55
  • @MinhNguyen: Как я уже сказал, UserStore приводит к тому, что некоторые люди хотят реализовать своих провайдеров вместо EF. Это не раскрыто. Вы не можете настроить UserManager для изменения поставщика данных. Вы просто не можете. Вам необходимо реализовать свой UserStore. UserStore - это хранилище, как в DDD. –  LeftyX 09.07.2015 в 21:39
  • Store = Репозиторий / Менеджер = Служба –  Rod 12.01.2016 в 13:43
Показать остальные комментарии
3

Идентичность основана на двух первичных блоках в 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 » на личность диспетчера проверки подлинности. Отрывок из блога .

Заключение % Co_de% - это, по сути, логика домена вашей ASP.NET Identity. Контроллер, который вы используете для обработки «входа» или «идентификации», передается с помощью UserManager , который как MSDN: Userstore изображает ...

  

Представляет реализацию Entity Framework хранилища пользователей, которая поддерживает IUserStore, IUserLoginStore, IUserClaimStore и IUserRoleStore.

После того, как UserStore имеет все необходимые поля для идентификации в качестве идентификатора, и вы квалифицировали UserStore в качестве диспетчера проверки подлинности и способ хранения контекста ... aka UserManager или какой-либо другой метод сохраняя значения в SQL (если используется), у вас будет система Identity, способная поддерживать логины.

    
ответ дан Adam 09.07.2015 в 17:03
  • Это все еще путало меня. Это мое понимание: для реализации операций с пользователями UserManager делает это на объекте UserStore. Основной целью UserStore является получение коллекции пользователей. Итак, почему мы не оставляем все операции (методы) только в классе UseManager? В чем разница между методами (add, delete ...) в UserStore и UserManaer? –  MinhNguyen 09.07.2015 в 17:32
  • Методы отличаются между классами? Они имеют одно и то же имя, но одно добавляет или удаляет претензию к пользователю, другое добавляет или удаляет заявку пользователей из «коллекции» аутентификации, –  Adam 09.07.2015 в 18:04
0

Я смотрел учебник Identity на YouTube, и я думаю, что этот снимок экрана может помочь:

Таким образом, UserManager - это фактический класс, с которым вы должны работать, но он не знает, как хранить и извлекать данные из базы данных. он даже не знает, куда будут поступать данные.

Для этих целей он использует UserStore и говорит ему, например: «Hey UserStore У меня есть новый пользователь, который нужно сохранить для будущего использования, я не знаю, где вы собираетесь его сохранить и как вы собираюсь сделать это, просто сохраните его для меня "

Затем UserStore выполняет фактическую работу, например, где должны сохраняться данные? какая база данных? и как? по умолчанию используется EF и SQL Server, поэтому, если вы хотите использовать какую-либо другую базу данных, например MySQL, вам понадобится другой UserStore.

Это одна из функций, которые были добавлены в Identity по сравнению с Membership, которые работали только с SQL Server.

Та же концепция применима для RoleManager и RoleStore.

    
ответ дан Sasan 10.08.2017 в 12:10