簡體   English   中英

UserManager.FindAsync不使用UserStore的自定義實現

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM