[英]UserManager.FindAsync not working with custom implementation of UserStore
我在ASP.NET身份方面相對較新。 為了更好地理解這些事情,我正在進行ASP.NET身份的自定義實現。 我能夠使用自定義代碼成功創建用戶。 但是, FindAsync(username, password)
功能無效。
這是我到目前為止所做的:
用戶 :這是繼承自IUser<int>
User
類
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)
。
之后,代碼永久地進入等待狀態,沒有任何反應,即控件永遠不會再次返回控制器。
我在這里缺少什么?
這行代碼有可能出現問題......
return new Task<string>(() => user.PasswordHash);
...這會創建一個永不啟動的任務,因此等待其繼續的代碼將永遠等待。 要返回包含在任務中的值,請使用Task.FromResult()
...
return Task.FromResult(user.PasswordHash);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.