gpt4 book ai didi

c# - UserManager.FindAsync 不适用于 UserStore 的自定义实现

转载 作者:可可西里 更新时间:2023-11-01 08:25:06 25 4
gpt4 key购买 nike

我是 ASP.NET Identity 的新手。为了更好地理解事情,我正在做 ASP.NET Identity 的自定义实现。我能够使用自定义代码成功创建用户。然而 FindAsync(username, password)功能不工作。

这是我到目前为止所做的:

用户:这是我的UserIUser<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 Controller 中,我有以下行尝试通过用户名和密码查找用户:

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

上面这行代码依次调用了UserStore的以下方法:

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

然后代码永远进入等待状态,什么也没有发生,即控制权再也不会返回给 Controller 。

我在这里缺少什么?

最佳答案

问题可能出在这行代码...

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

... 这会创建一个永远不会开始的任务,因此等待其继续的代码将永远等待。要返回包装在任务中的值,请使用 Task.FromResult()...

return Task.FromResult(user.PasswordHash);

关于c# - UserManager.FindAsync 不适用于 UserStore 的自定义实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24112932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com