C#IUserStore实现GetPasswordHash

时间:2015-05-21 12:09:57

标签: c# authentication asp.net-mvc-5

默认情况下,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);

有什么想法?

1 个答案:

答案 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的适当实现是从用户对象返回哈希值。