UserManager.FindAsync не работает с пользовательской реализацией UserStore

Я относительно новичок в ASP.NET Identity. Чтобы лучше понять, что я делаю пользовательскую реализацию ASP.NET Identity. Я могу создать пользователя с помощью пользовательского кода. Однако функция FindAsync(username, password) не работает.

Вот что я сделал до сих пор:

Пользователь. Это мой класс User, который наследует от IUser<int>

public class User:IUser<int>
{
    public User(){ Id = 0; }

    public int Id { get; private set; }
    public string UserName { get; set; }
    public string PasswordHash { get; set; }
    public string SecurityStamp { get; set; }
}

UserStore. Это пользовательская реализация IUserStore' and 'IUserPasswordStore

public class UserStore : IUserStore<User, int>, IUserPasswordStore<User, int>
{
    private IdentityContext _context;
    public UserStore()
    {
        _context = new IdentityContext();
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }

    #region IUserStore<T,K> members
    public Task CreateAsync(User user)
    {
        _context.Users.Add(user);
        _context.SaveChangesAsync();
        return Task.FromResult(true);
    }

    public Task UpdateAsync(User user)
    {
        throw new NotImplementedException();
    }

    public Task DeleteAsync(User user)
    {
        throw new NotImplementedException();
    }

    public Task<User> FindByIdAsync(int userId)
    {
        return _context.Users.FirstOrDefaultAsync(user=>user.Id==userId);
    }

    public Task<User> FindByNameAsync(string userName)
    {
        var user = _context.Users.SingleOrDefaultAsync(u => u.UserName.Equals(userName));
        return user;
    }
    #endregion

    #region IUserPasswordStore<User,int>
    public Task SetPasswordHashAsync(User user, string passwordHash)
    {
        user.PasswordHash = passwordHash;
        return Task.FromResult(true);
    }

    public Task<string> GetPasswordHashAsync(User user)
    {
        return new Task<string>(() => user.PasswordHash);
    }

    public Task<bool> HasPasswordAsync(User user)
    {
        throw new NotImplementedException();
    }
    #endregion
}

В моем контроллере MVC5 у меня есть следующая строка, которая пытается найти пользователя по имени пользователя и паролю:

var user = await UserManager.FindAsync("User1355436", "passw0rd");

Вышеприведенная строка кода, в свою очередь, последовательно вызывает следующие методы UserStore:

public Task<User> FindByNameAsync(string userName) и public Task<string> GetPasswordHashAsync(User user).

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

Что мне здесь не хватает?

Ответ 1

Проблема, вероятно, с этой строкой кода...

return new Task<string>(() => user.PasswordHash);

... это создает задачу, которая никогда не запускается, поэтому код, ожидающий ее продолжения, ждет навсегда. Чтобы вернуть значение, завернутое в задачу, используйте Task.FromResult()...

return Task.FromResult(user.PasswordHash);