Класса UserManager.FindAsync не работает с пользовательской реализацией UserStore
я относительно новичок в ASP.NET личность. Чтобы лучше понять вещи, я делаю пользовательскую реализацию ASP.NET личность. Я могу создать пользователя успешно, используя пользовательский код. Однако 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);