UserManager
- это способ абстрагирования слоя данных. Установив Identity на уровне контейнера, вы позволяете UserManager
работать с IUserStore
.
Например, вы можете видеть, что UserStore
в конечном итоге выполняет некоторые дополнительные задачи (такие как загрузка заявок, логины и роли). Он также соответствует верхнему (так что можно использовать нормализованное имя) и текущей культуре - подробности, которые вы бы хотели обрабатывать самостоятельно при непосредственном поиске в БД.
https://github.com/aspnet/AspNetIdentity/blob/master/src/Microsoft.AspNet.Identity.EntityFramework/UserStore.cs#L400
Кроме того, UserManager
может быть проще для тестирования, так как вам не нужно беспокоиться об использовании InMemory
для Entity Framework:
var userManager = new Mock<UserManager<User>>(
Mock.Of<IUserStore<User>>(),
Mock.Of<IOptions<IdentityOptions>>(),
Mock.Of<IPasswordHasher<User>>(),
new List<IUserValidator<User>>(),
new List<IPasswordValidator<User>>(),
Mock.Of<ILookupNormalizer>(),
new IdentityErrorDescriber(),
Mock.Of<IServiceProvider>(),
Mock.Of<ILogger<UserManager<User>>>());
Как и в любой самоуверенной библиотеке, Identity предоставляет UserManager
и RoleManager
как полезные абстракции доступа к данным, которые удобно выполняют множество полезных задач (без необходимости вообще вводить базу данных). Кроме того, если вам необходимо выполнить некоторые функции, связанные с пользователями / ролями, которые не предоставляются этими менеджерами, это может быть признаком анти-паттерна.
ОБНОВЛЕНИЕ:
Относительно безопасности: UserManager
будет таким же безопасным, как ваше соединение с базой данных, установленное в контейнере. Другими словами, вы шифруете строку подключения? Ваша связь с базой данных через безопасное соединение? Все типичные вопросы безопасности базы данных останутся прежними, независимо от того, абстрагируете ли вы соединение с БД внутри UserManager
или вводите контекст БД напрямую. Но я думаю, что безопасный доступ к базе данных - это совсем другой вопрос.
Внутри UserManager
есть методы, которые вы наверняка захотите использовать для их последствий для безопасности, особенно в отношении создания / управления паролями (CheckPasswordAsync
, AddPasswordAsync
и др. c.). Но в конечном итоге они зависят от того, какие реализации IPasswordHasher
и IPasswordValidator
введены в UserManager
. Похоже, ваш вопрос связан с простым поиском данных, поэтому это тоже отдельный вопрос.