【问题标题】:Temporary save password in db ASP.NET Core在 db ASP.NET Core 中临时保存密码
【发布时间】:2016-12-12 08:01:01
【问题描述】:

我正在开发 .NET Core 应用程序 + 身份。我想实现用户注册。 用户输入您的数据登录名/密码等。下一步我需要确认电子邮件,我不想在确认电子邮件之前在数据库中创建用户,因为我需要为他创建新数据库。我想将数据保存到数据库中的临时表。确认后,我将从那里获取数据并继续注册,然后从临时表中删除记录。

但正如我所见,Identity 有方法 userManager.Create(user, password),密码为明文。

我需要哈希/去哈希密码算法吗?如果是,那是什么? 在临时表中存储安全密码的最佳方法是什么?

【问题讨论】:

  • userManager 的默认实现默认对密码进行哈希处理,并且从不以明文形式存储或传输。

标签: asp.net-core asp.net-identity


【解决方案1】:

不,您不需要 - UserManager 会在数据库中自动对我进行哈希处理。

在我看来,创建临时记录并不是一个好主意。只需创建用户,将其标记为不活动,直到他确认他的电子邮件。这是正确的方法。

【讨论】:

  • 就我而言,用户注册后,我需要创建新数据库,然后将该新用户存储在新数据库中。而且我不想在没有确认电子邮件的情况下为所有用户创建数据库。
  • 在这种情况下,某种“主”数据库的概念可能是个好主意(除了专用于特定用户的数据库)
  • 那么,我是否需要将身份设置为“主”数据库,将用户保存在那里并在确认电子邮件后将数据从“主”数据库移动到新数据库?
  • 在这种情况下,也许这是个好主意 - 一开始我不知道您需要为每个用户创建数据库。或者您可以尝试覆盖默认用户存储。
  • 我可以使用身份创建没有密码的用户吗?然后简单地将 PasswordHash 添加给他。之后身份会正常工作吗?我的意思是安全印章等。
【解决方案2】:

你必须使用一些哈希算法。身份使用基于密码的密钥派生函数 2 (PBKDF2) - wiki。这是示例哈希密码方法。

public static string HashPass(string pwd)
{
    byte[] salt;
    byte[] bytes;

    using (Rfc2898DeriveBytes rfc2898DeriveByte = new Rfc2898DeriveBytes(pwd, 16, 1000))
    {
        salt = rfc2898DeriveByte.Salt;
        bytes = rfc2898DeriveByte.GetBytes(32);
    }
    byte[] num = new byte[49];
    Buffer.BlockCopy(salt, 0, num, 1, 16);
    Buffer.BlockCopy(bytes, 0, num, 17, 32);
    return Convert.ToBase64String(num);
}

最好使用带有一些状态的 UserAccount 表,您可以在其中存储有关用户帐户的状态:

public class UserAccount
{
   public int AccountId {  get; set;}

   public UserAccountStatus AccountStatus { get; set; }

}

public enum UserAccountStatus 
{
   Pending = 0,
   UsingTempPassword = 1
   Active = 2
}

【讨论】:

  • 对于新用户,我需要创建数据库并将其存储在那里,但我不想为所有用户都这样做。据我了解,在您的情况下,我无法对密码进行解密?
  • 在 ASP.NET Core 中类似的东西是可能的:userManager.PasswordHasher=new MyPasswordHasher()
【解决方案3】:

所以,我做了以下事情:

1) 为user = null(第一个参数)生成密码:

var hashPassword = _passwordHasher.HashPassword(null, command.Password);

2) 当用户确认电子邮件时,我使用默认密码创建他,该密码通过Startup.cs 类中的密码验证设置:

_userManager.CreateAsync(user, "123456");

3) 使用步骤 1 中的值更新 PasswordHash 列和用户:

user.PasswordHash = command.PasswordHash;
_userManager.UpdateAsync(user);

【讨论】:

    【解决方案4】:

    我认为最好的是 SHA1 哈希算法,标准是 128 位。我记得当我使用它完成我的 PHP 论文时 :)。这是最安全的。

    使用表单身份验证 ( https://msdn.microsoft.com/en-us/library/t8yy6w3h.aspx ):

    <configuration>
    <connectionStrings>
         <add name="SqlServices" connectionString="Data Source=MySqlServer;Integrated Security=SSPI;Initial Catalog=aspnetdb;" />
    </connectionStrings>
    <system.web>
      <authentication mode="Forms">
        <forms loginUrl="login.aspx" />
      </authentication>
      <authorization>
        <deny users="?" />
      </authorization>
      <membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="20">
      <providers>        
        <add name="SqlProvider"
          type="System.Web.Security.SqlMembershipProvider"
          connectionStringName="SqlServices"
          enablePasswordRetrieval="false"
          enablePasswordReset="true"
          requiresQuestionAndAnswer="false"
          passwordFormat="Hashed"
          applicationName="/" />
      </providers>
    </membership>
    </configuration>
    </system.web>
    

    你只需更改实例名称和登录页面。 默认哈希算法。是 SHA1,它在 .NET 4.0 框架中更改为 HMACSHA256 或 SHA256。你可以覆盖它:

    <membership
        defaultProvider="provider name"
        userIsOnlineTimeWindow="number of minutes"
        hashAlgorithmType="SHA1">
        <providers>...</providers>
    </membership>
    

    您可以指定您的 .NET 版本支持的最大 SHA,对于 .NET 4 和最新版本是 SHA512,但默认值必须是 ok。

    要添加您的内容,您可以在此处阅读(如果您不想全局使用它,它只是一个要在 machine.config 或 web.config 中配置的 .dll 文件):

    https://msdn.microsoft.com/en-us/library/693aff9y.aspx

    使用 Membership.Validate 在登录时验证用户。

    如果您使用 2013 年出现的新 MVC 东西,那么您只需实现持有电子邮件的用户,仅此而已,它必须是 IUser。 有一个方法 UserManager.CreateUser(TUser user, string password)

    【讨论】:

    • 会员提供者和 asp.net 身份(这是 OP 正在使用的)是两个非常不同且不兼容的用户管理框架。
    • SHA1 被认为从根本上被破坏了。它肯定不是“最安全的”,如此强烈地推荐它几乎是疏忽。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2013-09-08
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    相关资源
    最近更新 更多