C# IUserStore 实现 GetPasswordHash

4

默认情况下,MVC 5单页应用程序使用EntityFramework来存储用户和密码以进行身份验证。

在我的情况下,我必须使用现有的自制AuthenticationService。

我决定创建一个自定义的IUserStore。然后,我必须实现GetPasswordHashASync来验证凭据。

我们的架构师认为这是一种安全漏洞,但我不同意。因此,我想听听你的意见。

获取另一个服务数据库的PasswordHash有何区别?在我看来,这并不是一种安全漏洞...

以下是一些代码,以演示它的工作原理。

用户使用其凭据登录,因此调用我的AccountController的Login方法。然后,它调用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个回答

3
你要实现的接口是IUserPasswordStore。这是实现OWIN身份存储(以及其他身份验证框架)的正确方式。我已经为MongoDB实现的OWIN编写了自己的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的适当实现是从用户对象返回哈希值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接