使用散列密码更新现有的LocalDB条目?

时间:2017-05-15 16:15:02

标签: c# asp.net wpf hash localdb

我正在开发一个任务(没有专业,只是为了学习),我有一个应用程序,它在ASP.NET中有一个Web应用程序,在WPF中有一个管理员应用程序。这两个项目都连接到同一个localdb数据库。任务是确保只有非管理员可以在Web应用程序上注册,但WPF应用程序上的管理员也需要身份验证(并且Users表也有一些依赖项)。

所以,数据库就像:

UsrName  UsrPwd   IsAdmin
admin    NULL     True
nonadmin kdjfgbjk False

我的问题是,UsrPwd仅包含出于安全原因的用户bc的哈希密码。现在。由于只有非管理员才能在网络应用程序上注册,我不知道如何因为散列而向管理员添加密码 - 我通过SQL查询添加了管理员(这就是为什么他们的{ {1}}是UsrPwd)。

所以我的问题是:如何更新管理员用户的密码,以便我知道密码是什么(想想我是提供初始密码的系统管理员),但只有散列密码才会保存在数据库中?

我考虑通过注册用户并通过SQL将NULL更改为IsAdmin来解决问题,但由于管理员用户名存在一些外键依赖关系,因此我可以通过SQL来解决问题。 d而不是那样做(我必须重建数据库)。

有什么办法可以为管理员用户添加密码吗?我认为这里的关键字是某种代码优先迁移可能(?)但我不知道如何做到这一点,或者甚至可以采用这种方式。

谢谢!

修改

我并没有真正使用Identity或OWIN或类似的东西,我所做的只是:

True

其中using (SHA512CryptoServiceProvider provider = new SHA512CryptoServiceProvider()) { passwordBytes = provider.ComputeHash(Encoding.UTF8.GetBytes(user.UserPassword)); } _entities.SoftwareUser.Add(new SoftwareUser { UsrName = user.UserName, UsrPwd = passwordBytes, IsAdmin = false, }); 是基于数据库生成的实体。

1 个答案:

答案 0 :(得分:0)

我会把这个放在你的网络应用程序启动的某个地方。

Func<string, byte[]> getPwHash = (pwStr) => {
    using (SHA512CryptoServiceProvider provider = new SHA512CryptoServiceProvider())
    {
        return provider.ComputeHash(Encoding.UTF8.GetBytes(pwStr));
    }            
};



var nullpwUsers = _entities.SoftwareUser.Where(user => user.UsrPwd == null);
foreach(var user in nullpwUsers) 
{
    user.UserPwd = getPwHash("DefaultPassword");
}
_entities.SaveChanges();