Используйте разные поля для проверки в ASP.NET Identity

1

Я использую идентификатор ASP.NET, но я хотел бы проверить пользователя с разными полями вместо того, чтобы использовать адрес электронной почты (или имя пользователя) и пароль.

В моем сценарии у пользователя есть код ключа, а не адрес электронной почты. В этом поле кода ключа я знаю, как добавить в IdentityUser через ApplicationUser но я нашел проблему, когда мне нужно проверить, существует ли она в базе данных. Пользователь UserManager имеет методы поиска пользователя по имени пользователя и паролю (или электронной почте), но не для пользовательских свойств, которые я добавил (очевидно).

Я попытался реализовать свой собственный UserManager но он казался таким большим усилием для довольно "простой" вещи. Мне нужен только один дополнительный метод.

Одним из решений является использование имени пользователя в качестве поля для хранения кода ключа. Однако мне очень не нравится эта идея. Он не очень чист, чувствует себя обманом; и мне может понадобиться это поле в будущем для его первоначальной цели.

Является ли решение с лучшим компромиссом между сложностью и чистым решением?

Заранее большое спасибо!

Теги:
asp.net-identity

1 ответ

2

Ограничение в 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);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню