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

Updating existing LocalDB entry with hashed password?

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

所以,数据库就像:

UsrName  UsrPwd   IsAdmin
admin    NULL     True
nonadmin kdjfgbjk False

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

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

我考虑通过注册用户并通过 SQL 将 IsAdmin 更改为 True 来解决问题,但由于管理员用户名存在一些外键依赖性,我'我不想那样做(我必须重建数据库)。

有什么方法可以为管理员用户添加密码吗?我认为这里的关键字可能是某种代码优先迁移(?),但我不知道该怎么做,或者这是否可行。

谢谢!

编辑

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

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,
});

其中SoftwareUser是根据数据库生成的实体

我会将它放在 Web 应用程序启动时运行的某个位置。

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();