我正在开发一个任务(没有专业,只是为了学习),我有一个应用程序,它在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,
});
是基于数据库生成的实体。
答案 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();