Usermanager.VerifyHashedPassword
结果何时结果为PasswordVerificationResult.SuccessRehashNeeded
?
如果出现这样的结果该怎么办?
使用VerifyHashedPassword
时,我只会使用Success
进行检查。是否足够或我应该使用Failed
进行检查?
答案 0 :(得分:4)
// REQUIRES ES6!
$scope.$broadcast('from-parent', {[prop]: newValue[prop]});
似乎public virtual PasswordVerificationResult VerifyHashedPassword(TUser user, string hashedPassword, string providedPassword)
{
if (hashedPassword == null)
{
throw new ArgumentNullException(nameof(hashedPassword));
}
if (providedPassword == null)
{
throw new ArgumentNullException(nameof(providedPassword));
}
byte[] decodedHashedPassword = Convert.FromBase64String(hashedPassword);
// read the format marker from the hashed password
if (decodedHashedPassword.Length == 0)
{
return PasswordVerificationResult.Failed;
}
switch (decodedHashedPassword[0])
{
case 0x00:
if (VerifyHashedPasswordV2(decodedHashedPassword, providedPassword))
{
// This is an old password hash format - the caller needs to rehash if we're not running in an older compat mode.
return (_compatibilityMode == PasswordHasherCompatibilityMode.IdentityV3)
? PasswordVerificationResult.SuccessRehashNeeded
: PasswordVerificationResult.Success;
}
else
{
return PasswordVerificationResult.Failed;
}
case 0x01:
int embeddedIterCount;
if (VerifyHashedPasswordV3(decodedHashedPassword, providedPassword, out embeddedIterCount))
{
// If this hasher was configured with a higher iteration count, change the entry now.
return (embeddedIterCount < _iterCount)
? PasswordVerificationResult.SuccessRehashNeeded
: PasswordVerificationResult.Success;
}
else
{
return PasswordVerificationResult.Failed;
}
default:
return PasswordVerificationResult.Failed; // unknown format marker
}
}
是我们从当前SuccessRehashNeeded
版本更改为另一个版本的结果。
答案 1 :(得分:2)
SuccessRehashNeeded
是一种在这些用户每次访问其帐户时将现有用户密码哈希静默迁移到新算法的好方法。
例如,Microsoft将其用作从Sql Membership迁移到Microsoft Identity的开发人员的迁移指南的一部分。现有的密码仍然可以用于登录,但应在发生这种情况后立即将其重新加密。
有关示例,请参见https://docs.microsoft.com/en-us/aspnet/identity/overview/migrations/migrating-an-existing-website-from-sql-membership-to-aspnet-identity(在页面上搜索SuccessRehashNeeded
)。
答案 2 :(得分:1)
要添加到现有答案,PasswordVerificationResult.SuccessRehashNeeded
还可能表示散列函数的参数(例如work factor)已更改,密码需要重新散列以生成散列新参数。由于应用程序访问用户密码的唯一时间是在哈希验证期间,这是应用程序能够重新扫描用户密码的唯一时间,这也是为什么这是结果的选项。
这确实是我们在PasswordHasher.cs中看到的。 IPasswordHasher
通过标记它来重新散列新参数来“升级”散列。