我正在尝试在.NET Core 3.1中使用用户管理器,但以下代码:
public async Task<bool> CheckPassword(User user, string password)
{
var appUser = _mapper.Map<AppUser>(user);
return await _userManager.CheckPasswordAsync(appUser, password);
}
引发此异常:
输入不是有效的 Base-64 字符串,因为它包含非 base-64 字符、两个以上的填充字符或非法字符 在填充字符中
堆栈跟踪:
at System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength( at System.Convert.FromBase64String(String s( at Microsoft.AspNetCore.Identity.PasswordHasher
1.VerifyHashedPassword(TUser user, String hashedPassword, String providedPassword) at Microsoft.AspNetCore.Identity.UserManager
这很奇怪,因为 .Net Core 2 中的数据库中具有相同哈希的相同代码运行良好。 任何想法问题出在哪里?
编辑:
我找到了这个文件:https://github.com/dotnet/aspnetcore/blob/e276c8174b8bfdeb70efceafa81c75f8badbc8db/src/Identity/Extensions.Core/src/PasswordHasher.cs
看起来问题就在这里:
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);
但是我试图通过 https://base64.guru/tools/validator 及其 Ok 来验证数据库中的哈希。
您需要保存散列密码,或者需要重写 CheckPassword 方法以进行手动检查。
默认情况下,系统会检查散列密码,并且您正在传递纯文本。