2016-03-23 38 views
1

我正在設置一個asp.net web api 2應用程序,並且我在自定義Identity.UserManager驗證用戶密碼時遇到問題。當我嘗試驗證用戶的哈希密碼時,它總是返回失敗!即使我知道我提供了正確的密碼。這裏我試圖驗證一個用戶並向該用戶返回一個令牌。用戶數據表(DVUsers)存儲在MySQL數據庫中。我懷疑我的問題是如何將密碼哈希存儲在mysql中。ASP.net Identity UserManager未驗證密碼

從一開始,我的授權服務器Proivder:

public class AuthServerProvider : OAuthAuthorizationServerProvider 
{ 
    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     context.Validated(); 
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 

     try 
     { 
      AuthContext _ctx = new AuthContext(); 
      DVUserManager userManager = new DVUserManager(_ctx); 
      AuthRepo _repo = new AuthRepo(userManager, _ctx); 

      DVUser user = await _repo.FindUser(context.UserName, context.Password); 

      if (user == null) 
      { 
       context.SetError("invalid_grant", "The user name or password is incorrect."); 
       return; 
      } 

      var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
      identity.AddClaim(new Claim("sub", context.UserName)); 
      identity.AddClaim(new Claim("role", "user")); 

      context.Validated(identity); 
     } 
     catch (Exception ex) 
     { 
      context.SetError("invalid_grant", "message"); 
     } 
    } 
} 

現在,這裏是我的AuthRepo類。 VerifyHashedPsssword始終在方法FindUser中返回失敗。

public class AuthRepo : IDisposable 
{ 
    private AuthContext _ctx; 
    private DVUserManager _userManager; 

    public AuthRepo(DVUserManager userManager, AuthContext ctx) 
    { 
     _ctx = ctx; 
     _userManager = userManager; 
    } 

    public async Task<IdentityResult> RegisterUser(DVUser user) 
    { 
     DVUser iuser = new DVUser { UserName = user.UserName}; 

     var result = await _userManager.CreateAsync(iuser, user.UserName); 
     return result; 
    } 
    public async Task<DVUser> FindUser(string userName, string Password) 
    { 
     //Find the user works fine, it finds the correct user 
     DVUser user = await _userManager.FindByNameAsync(userName); 

     //compare passwords. VerifyHasedPAssword ALWAYS is returning failed 
     PasswordVerificationResult result = _userManager.PasswordHasher.VerifyHashedPassword(user.Password, Password); 

     if (result == PasswordVerificationResult.Success) { return user; } 
     else { return null; } 
    } 

    public void Dispose() 
    { 
     _ctx.Dispose(); 
     _userManager.Dispose(); 
    } 
} 

你可能想看到我的支持類。

public class AuthContext : IdentityDbContext<IdentityUser> 
{ 
    public AuthContext() : base("localhost") //name of the data connection to use 
    { 

    } 
    public DbSet<DVUser> DVUsers { get; set; } 
} 

我的自定義用戶經理

public class DVUserManager : UserManager<DVUser> 
{ 
    public DVUserManager(AuthContext ctx) : base(new DVUserStore(ctx)) 
    { 
     PasswordValidator = new MinimumLengthValidator(4); 
    } 
} 

這裏是實現IUSER

public class DVUser : IUser 
{ 
    public string Id 
    { 
     get; set; 
    } 

    public string UserName 
    { 
     get; set; 
    } 

    public string Password { get; set; } 

    public int DVClientID { get; set; } 
} 

最後我的客戶UserStore

public class DVUserStore : IUserStore<DVUser>, IUserPasswordStore<DVUser> 
{ 
    AuthContext _context; 
    public DVUserStore(AuthContext context) 
    { 
     _context = context; 
    } 

    public Task CreateAsync(DVUser user) 
    { 
     user.Id = Guid.NewGuid().ToString(); 
     _context.DVUsers.Add(user); 
     return _context.SaveChangesAsync(); 
    } 

    public Task DeleteAsync(DVUser user) 
    { 
     throw new NotImplementedException(); 
    } 

    public void Dispose() 
    { 
     _context.Dispose(); 
    } 

    public Task<DVUser> FindByIdAsync(string userId) 
    { 
     throw new NotImplementedException(); 
    } 

    public Task<DVUser> FindByNameAsync(string userName) 
    { 
     Task<DVUser> task = _context.DVUsers.Where(
        apu => apu.UserName == userName) 
        .FirstOrDefaultAsync(); 

     return task; 
    } 

    public Task<string> GetPasswordHashAsync(DVUser user) 
    { 
     if (user == null) 
     { 
      throw new ArgumentNullException("user"); 
     } 

     return Task.FromResult(user.Password); 
    } 

    public Task<bool> HasPasswordAsync(DVUser user) 
    { 
     return Task.FromResult(user.Password != null); 
    } 

    public Task SetPasswordHashAsync(DVUser user, string passwordHash) 
    { 
     return Task.FromResult(user.Password = passwordHash); 
    } 

    public Task UpdateAsync(DVUser user) 
    { 
     throw new NotImplementedException(); 
    } 
} 

MySQL表,DVUsers看起來DVUser像t他的。 DVUsers Table, UTF8 encoding

這是DVUsers中的數據。有一個用戶 DVUsers table data

感謝您的任何幫助!

回答

1

我找到了解決方案!有兩個問題。首先,我是一個白癡。在這一行查看AuthRepo類中的註冊用戶方法:
var result = await _userManager.CreateAsync(iuser,user.UserName); 我將用戶密碼設置爲USERNAME而不是我的表單發送的密碼...噢,我的上帝..

第二個問題!我發現它仍然沒有工作。我發現如果將我的密碼列數據類型設置爲二進制(68),密碼哈希將被正確存儲。最後它工作。我希望我能幫助別人!