Это плохая практика для получения pNet пользователя непосредственно из БД против UserManager? - PullRequest
0 голосов
/ 28 марта 2020
  1. В чем преимущество использования userManager.FindByUsernameAsync() перед получением пользователя напрямую из БД?

  2. Является ли использование UserManager более безопасным? var user = await UserManager.FindByNameAsyn c (userName);

1 Ответ

2 голосов
/ 28 марта 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...