我使用Crypto.HashPassword('nakedPassword');
对用户密码进行了哈希处理,并将此值保存在我的数据库中。
注册期间:
public Status Signup(Customer user)
{
//change password to password hash & create a verification codetry
try
{
int pkid;
user.PASSWORD = Crypto.HashPassword(user.PASSWORD);
user.VER_CODE = Guid.NewGuid().ToString();
Mapper.CreateMap <Customer,user>();
var mappedcustomer = Mapper.Map<Customer,user>(user);
string result = _userRepository.Signup(mappedcustomer);
Status status = new Status();
if (result == "MOB_EXISTS")
{
status.setError("Mobile number already exists");
}
else if (result == "EMAIL_EXISTS")
{
status.setError("Email already exists");
}
} catch (Exception e) {}
}
稍后我在登录时使用:
进行检索Status status = new Status();
try
{
string hashedPass = _userRepository.GetHashedPassByEmail(email);
if (Crypto.VerifyHashedPassword(hashedPass, password)) //<-- THIS LINE THROWS THE EXCEPTION
{
//authenticated
status.setSuccess("Login successful !");
}
else
{
status.setError("Invalid Credentials. Please try again.");
}
}
catch (Exception e)
{
status.setError("Error during login. Please check the credentials and try again.");
}
指向的行抛出异常
System.FormatException
Base-64字符数组或字符串的长度无效。
堆栈跟踪:
在System.Convert.FromBase64_Decode(Char * startInputPtr,Int32 inputLength,Byte * startDestPtr,Int32 destLength)at System.Convert.FromBase64CharPtr(Char * inputPtr,Int32 inputLength)
在System.Convert.FromBase64String(String s)at System.Web.Helpers.Crypto.VerifyHashedPassword(String hashedPassword, 字符串密码)在Tmmmt.Business.UserProvider.login(String email, 字符串密码) C:\ Users \用户的MacBook \源\回购\ tmmmt.com \ Tmmmt.Business \ UserProvider.cs:线 802
注意:这不会一直发生,但仅在某些注册时发生。
请参阅 Crypto.VerifyHashedPassword
修改
当我查看我的代码注册时,我看到生成了一个哈希,但在写入db时会被截断。
例如......
实际哈希: ANFRzzPtJ6H / hmsxmbPpkUgIDcmxoaWDV6Ej8Xes8 + PupKnsKq3EI / cUTHCRZm9t +克==
Db中的哈希: ANFRzzPtJ6H / hmsxmbPpkUgIDcmxoaWDV6Ej8Xes8 + PupKnsKq
数据库中的密码字段为varchar(8000)
,我将通过以下方式进行...
public virtual ObjectResult<string> sp_signupweb(string name, string email, string passHash, string code, Nullable<long> mob, Nullable<int> utc, string verifycode, ObjectParameter result)
{
...//some code//
var passHashParameter = passHash != null ?
new ObjectParameter("passHash", passHash) :
new ObjectParameter("passHash", typeof(string));
//.... some more code
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<string>("sp_signupweb", nameParameter, emailParameter, passHashParameter, codeParameter, mobParameter, utcParameter, verifycodeParameter, result);
}
有人可以解释截断并帮我解决。
答案 0 :(得分:0)
修复存储过程(注册)的参数长度为我修复了它。有关详细信息,请查看有关OP的评论