使用散列密码更新现有的 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 查询添加了管理员(这就是为什么他们的 UsrPwd
是 NULL
)。
所以我的问题是:如何更新管理员用户的密码以便我知道密码是什么(把我想象成提供初始密码的系统管理员),但只有哈希密码被保存在数据库?
我考虑通过注册用户并通过 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();
我正在开发一个任务(不是专业的,只是为了学习),我有一个应用程序,其中有一个 ASP.NET 中的 Web 应用程序和一个 WPF 中的管理员应用程序。这两个项目都连接到同一个 localdb 数据库。任务是确保只有非管理员才能在 Web 应用程序上注册,但 WPF 应用程序上的管理员也需要身份验证(并且用户 table 也有一些依赖项)。
所以,数据库就像:
UsrName UsrPwd IsAdmin
admin NULL True
nonadmin kdjfgbjk False
我的问题是,出于安全原因,UsrPwd
仅包含 散列 密码。现在。由于只有非管理员才能在网络应用程序上注册,我不知道如何为管理员添加密码,因为散列 - 我通过 SQL 查询添加了管理员(这就是为什么他们的 UsrPwd
是 NULL
)。
所以我的问题是:如何更新管理员用户的密码以便我知道密码是什么(把我想象成提供初始密码的系统管理员),但只有哈希密码被保存在数据库?
我考虑通过注册用户并通过 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();