我想手动验证 ASP.NET Identity 2.0 中的密码重置令牌。我正在尝试创建我自己的版本UserManager.ResetPasswordAsync(string userId, string token, string newPassword)
这需要和IdentityUser
代替userId
像这样:
UserManager.ResetPasswordAsync(IdentityUser user, string token, string newPassword)
不确定我这样做是否正确,但在这里我尝试验证在先前步骤中通过电子邮件发送给用户的代码。我没有修改将电子邮件发送给用户并生成代码的代码/令牌。我假设这是正确的调用方法,但是purpose
论证不正确。 (我尝试传递“ASP.NET Identity”,但没有成功。)
if (await userManager.UserTokenProvider.ValidateAsync(purpose: "?", token: code, manager: userManager, user: user))
{
return IdentityResult.Success;
}
else
{
return new IdentityResult("Invalid code.");
}
如果有人可以向我详细介绍它如何开箱即用,或者向我指出 Microsoft 的源代码UserManager.ResetPasswordAsync(IdentityUser user, string token, string newPassword)
我们将不胜感激!
我通过将目的设置为“ResetPassword”解决了我的问题。
下面是最终结果的片段,以防有人想做类似的事情。这是我的一个方法ApplicationUserManager
班级。但要意识到,Microsoft 实现的某些异常处理缺失或未本地化,因为其代码中使用的某些私有变量、方法和资源无法访问。不幸的是,他们没有保护这些东西,以便我能够得到它。失踪者ThrowIfDisposed
方法调用对我来说特别有趣(而且很有趣)。显然,他们期望在实例被处置后调用方法,以便提供更友好的错误消息并避免意外情况。
public async Task<IdentityResult> ResetPasswordAsync(IdentityUser user,
string token, string newPassword)
{
if (user == null)
{
throw new ArgumentNullException("user");
}
// Make sure the token is valid and the stamp matches.
if (!await UserTokenProvider.ValidateAsync("ResetPassword", token,
this, user))
{
return IdentityResult.Failed("Invalid token.");
}
// Make sure the new password is valid.
var result = await PasswordValidator.ValidateAsync(newPassword)
.ConfigureAwait(false);
if (!result.Succeeded)
{
return result;
}
// Update the password hash and invalidate the current security stamp.
user.PasswordHash = PasswordHasher.HashPassword(newPassword);
user.SecurityStamp = Guid.NewGuid().ToString();
// Save the user and return the outcome.
return await UpdateAsync(user).ConfigureAwait(false);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)