【问题标题】:Generate a PasswordHash and SecurityStamp生成 PasswordHash 和 SecurityStamp
【发布时间】:2022-02-10 16:58:44
【问题描述】:

我有一个Registrations 表,新用户可以放入其中。稍后的过程会为该用户创建一个数据库,并从注册表中的数据(电子邮件和姓名)中插入一个 ASP.NET 身份用户记录。

我想扩展它,以便在注册时,用户可以输入他们的密码,然后在新数据库中设置该密码。

要正确执行此操作,我需要创建一个SecurityStamp 值,然后使用该值加密密码以获得PasswordHash,我相信。然后我会将这些值存储在registrations表中,然后我可以在设置好后将它们复制到用户的新数据库中,他们将能够使用他们注册的密码登录。

我该怎么做 - 生成 SecurityStamp 然后散列密码?

【问题讨论】:

  • Identity 为你处理这一切,你不使用UserManager 类吗?
  • @DavidG 注册时数据库不存在。我想安全地存储密码,直到稍后的进程创建数据库,然后使用 UserManager 类创建初始用户帐户。

标签: asp.net asp.net-identity


【解决方案1】:

SecurityStamp 可以是任何随机的、不可重复的 - Guid.NewGuid().ToString() 可以很好地完成这项工作。

对于密码哈希UserManager 有属性PasswordHasher 为您进行密码哈希:

var userManager = new UserManager(context);
var passwordHash = userManager.PasswordHasher.HashPassword("mySecurePassword");

【讨论】:

  • 嗯。因此,我无需将 SecurityStamp 存储在注册表中。我只需要散列密码并存储它,对吗?其次,如果我使用contextA 对密码进行哈希处理,然后将值更新到contextB 的用户表中的PasswordHash 字段中,这并不重要 - 对吗?
  • @Sean 对所有帐户都正确。 SecurityStamp 的更改将使所有用户的现有 cookie 无效 - 使他们再次登录。将密码哈希移动到其他位置不会影响密码。 Salt 与实际哈希一起嵌入在同一列中,实际哈希不依赖于任何存储实现。
【解决方案2】:

使用这个命名空间

使用 Microsoft.AspNetCore.Identity;

生成哈希使用

var pass = new PasswordHasher<object>().HashPassword(null, "your password");

测试您的密码哈希

var passCheck = new PasswordHasher<object>().VerifyHashedPassword(null, hashedpassword, "your test password");

return ((int)passCheck) == 1 ? "correct password" : "invalid password";

【讨论】:

    猜你喜欢
    • 2018-01-17
    • 2018-03-02
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2016-12-22
    相关资源
    最近更新 更多