12

我在 ASP.NET 身份方面相对较新。为了更好地理解这些事情,我正在做一个 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)

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

我在这里缺少什么?

4

1 回答 1

12

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

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

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

return Task.FromResult(user.PasswordHash);
于 2014-06-09T04:59:16.973 回答