Я использую идентификатор ASP.NET, но я хотел бы проверить пользователя с разными полями вместо того, чтобы использовать адрес электронной почты (или имя пользователя) и пароль.
В моем сценарии у пользователя есть код ключа, а не адрес электронной почты. В этом поле кода ключа я знаю, как добавить в IdentityUser
через ApplicationUser
но я нашел проблему, когда мне нужно проверить, существует ли она в базе данных. Пользователь UserManager
имеет методы поиска пользователя по имени пользователя и паролю (или электронной почте), но не для пользовательских свойств, которые я добавил (очевидно).
Я попытался реализовать свой собственный UserManager
но он казался таким большим усилием для довольно "простой" вещи. Мне нужен только один дополнительный метод.
Одним из решений является использование имени пользователя в качестве поля для хранения кода ключа. Однако мне очень не нравится эта идея. Он не очень чист, чувствует себя обманом; и мне может понадобиться это поле в будущем для его первоначальной цели.
Является ли решение с лучшим компромиссом между сложностью и чистым решением?
Заранее большое спасибо!
Ограничение в IUserStore (имеет только методы Create, Update, Delete, FindById и FindByName (username)), которые использует UserManager для извлечения данных из базы данных. Поэтому, если вы хотите расширить UserManager с помощью новой функции, которая дает пользователю ключ по коду, вам также необходимо расширить IUserStore.
В общем, мне не нравится решение помещать "неправильные данные" в собственность. Таким образом, чтобы расширить UserManager и UserStore в отношении ваших потребностей, выполните следующие действия:
Сначала расширьте интерфейс IUserStore
public interface IMyUserStore : IUserStore<User>
{
Task<User> FindByKeyCodeAsync(string keyCode);
}
Внедрение нового интерфейса
public class MyUserStore : UserStore<User>, IMyUserStore
{
public Task<User> FindByKeyCodeAsync(string keyCode)
{
return Users.Where(x => x.KeCode == keyCode);
}
}
Расширение UserManager
public class MyUserManager : UserManager<User>
{
private readonly IMyUserStore _store;
public MyUserManager(IMyUserStore store)
: base(store)
{
_store = store;
}
public virtual Task<User> FindByKeyCodeAsync(string keyCode)
{
var a = new UserStore<User>();
return _store.FindByKeyCodeAsync(keyCode);
}
}
И если вы хотите получить пользователя по любому параметру, вы можете изменить метод FindByKeyCodeAsync, чтобы:
public Task<User> Find(Expression<Func<User, bool>> expression)
{
return Users.SingleAsync(expression);
}