我正在开发.net core app Identity。我想实现用户注册。用户输入您的数据登录/密码等。下一步我需要确认电子邮件,我不想在他确认电子邮件之前创建用户,因为我需要为他创建新的DB。我想将数据保存到DB中的临时表。确认后,我将从那里获取数据并继续注册,然后从临时表中删除记录。
但是,正如我所看到的,身份具有清晰文本中的密码的方法userManager.Create(user, password)
。
我需要哈希/dehash密码算法吗?如果是,那是什么?将安全密码存储在临时表中的最佳方法是什么?
不,您不需要 - usermanager会在数据库中自动hash。
我认为创建临时记录不是好主意。只需创建用户,将其标记为不活动,直到他确认电子邮件为止。那是正确的方法。
一定要使用一些哈希算法。身份使用基于密码的密钥推导功能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);
}
更好的想法将被使用用户account表具有某些状态,您可以在其中存储有关用户帐户的状态:
public class UserAccount
{
public int AccountId { get; set;}
public UserAccountStatus AccountStatus { get; set; }
}
public enum UserAccountStatus
{
Pending = 0,
UsingTempPassword = 1
Active = 2
}
所以,我做了以下操作:
1)生成用户的密码= null(第一个参数):
var hashPassword = _passwordHasher.HashPassword(null, command.Password);
2)当用户确认电子邮件时,我使用默认密码创建他,该密码通过Startup.cs
类中的密码验证设置:
_userManager.CreateAsync(user, "123456");
3)更新passwordhash列和用户,并从步骤1开始进行值:
user.PasswordHash = command.PasswordHash;
_userManager.UpdateAsync(user);
我认为最好的是sha1 hash算法,标准为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>
u只是更改实例名称和登录页面。默认哈希alg。是SHA1,它在.NET 4.0框架中更改为HMACSHA256或SHA256。你可以覆盖它:
<membership
defaultProvider="provider name"
userIsOnlineTimeWindow="number of minutes"
hashAlgorithmType="SHA1">
<providers>...</providers>
</membership>
您可以指定最大的.NET版本支持的.NET 4和最新版本是SHA512,但是默认值必须可以。
要添加您的您可以在此处阅读(如果您不想在全球范围内使用它,它只是一个.dll。
https://msdn.microsoft.com/en-us/library/693aff9y.aspx
使用会员资格。validate在日志上验证用户。
如果您使用了2013年的新MVC事物,则有Usermanager U仅实现您的用户持有电子邮件的用户,仅此而已,它一定是iuser。有一个方法usermanager.createuser(Tuser用户,字符串密码)