默认情况下,MVC 5单页应用程序使用EntityFramework存储用户和密码以进行身份验证。
在我的场景中,我必须使用现有的自制AuthenticationService。
我决定创建一个自定义IUserStore。然后,我必须实现GetPasswordHashASync
来验证凭据。
我们的架构师认为这是一个安全漏洞,但我不同意这一点。我想对此有所了解。
在同一服务器节点上获取另一个服务的数据库的PasswordHash有什么区别。在我看来,我不认为这是一个安全漏洞......
这里有一些代码来演示它是如何工作的。
用户使用他的凭据登录,因此它调用了我的AccountController的登录方法。然后,它调用UserManager FindUserAsync
:
var user = await UserManager.FindAsync(model.Email, model.Password);
由于我创建了自己的IUserStore,因此我将服务(WFC)称为:
if (client.IsUsernameExists(userName, remoteInfo, out messages))
{
user = new ApplicationUser() { Email = userName, Username = userName};
}
在引擎盖下,它会调用GetPasswordHashAsync
。我的实现然后再次调用我们的服务:
passwordHash = client.GetPasswordHash(user.Username, RemoteInfo, out messages);
有什么想法?
答案 0 :(得分:3)
您要实现的接口是IUserPasswordStore。没错。
这是实现OWIN(可能还有其他身份验证框架)IdentityStores的正确方法。
我为OWIN的MongoDB实现实现了自己的UserStore。这是我对IUserPasswordStore的实现
public Task SetPasswordHashAsync(TUser user, string passwordHash)
{
user.PasswordHash = passwordHash;
return Task.FromResult(0);
}
public Task<string> GetPasswordHashAsync(TUser user)
{
return Task.FromResult(user.PasswordHash);
}
密码哈希存储在数据库中,因此当您从数据库中提取用户时,它具有哈希值属性。因此,GetPasswordHashAsync的适当实现是从用户对象返回哈希值。