2014-06-09 72 views
11

ASP.NET Kimliğinde nispeten yeni. Her şeyi daha iyi anlamak için ASP.NET Kimliğinin özel bir uygulamasını yapıyorum. Özel kod kullanarak başarıyla kullanıcı oluşturabiliyorum. Ancak, FindAsync(username, password) işlevselliği çalışmıyor.UserManager.FindAsync UserStore uygulamasının özel uygulamasıyla çalışmaz

Kullanıcı: Bu 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 devralır benim User sınıftır: Burada

şimdiye kadar yaptıklarını olan bu IUserStore' and 'IUserPasswordStore

özel uygulamasıdır
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 
} 

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

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

dönüş sırayla kod yukarıdaki satırı UserStore aşağıdaki yöntemleri çağırır: my MVC5 kontrolörü olarakben kullanıcı adı ve şifre ile kullanıcı bulmak çalışır aşağıdaki satırı var . Ve bundan sonra kod sürekli olarak bekleme durumuna geçer ve hiçbir şey olmaz, yani kontrol asla tekrar kontrolöre geri gönderilmez.

Burada neyim var?

+0

Merhaba ben nasıl çalışacağını MVC diğer uygulamadan Web API çağrısı bana herhangi GitHub veya uygulama demo bağlantısı ı verin nasıl anlamak istiyorum ... Task.FromResult() kullanmak görebilmek. –

cevap

10

sorun bu kod satırı ile olasıdır ...

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

... Bu başlatan asla bir görev oluşturur, bu nedenle onun devamı için bekleyen kod sonsuza bekler. Bir görev sarılmış bir değer döndüren için,

return Task.FromResult(user.PasswordHash); 
+0

Açıklama için teşekkürler. İşe yaradı. :) –

+1

Şimdi, son 10 saat içinde hata ayıklamada ne olduğunu biliyorum, acımı bitirmek için +1. Ama niçin cehennemde bir 'Görev' döndürüyoruz ve çağrı sınıfı onu başlatmıyor ?! –

İlgili konular