【问题标题】:C# IUserStore implementation GetPasswordHashC# IUserStore 实现 GetPasswordHash
【发布时间】:2015-08-03 02:21:02
【问题描述】:

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

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2016-11-18
      • 2013-11-19
      • 2011-07-26
      相关资源
      最近更新 更多