2016-03-23 19 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のデータがあります。 1人のユーザーがいる DVUsers table data

ありがとうございました!

答えて

1

そして私は解決策を見つけました! 2つの問題がありました。まず、私はばかです。 AuthRepoクラスのRegister Userメソッドを次の行に見てください。
var result = await _userManager.CreateAsync(iuser、user.UserName); 私のフォームで送信されたパスワードではなく、ユーザーのパスワードをUSERNAMEに設定しています...ああ、私の神よ...

2番目の問題!私はそれがまだ動作していないことがわかった。パスワード列データ型をバイナリ(68)に設定すると、パスワードハッシュが正しく格納されることがわかりました。結局それは働く。私は誰かを助けて欲しい!

関連する問題