gra*_*row 14 c# asp.net asp.net-identity
要重置密码,我们需要知道UserId并将其传递给UserManager.ResetPasswordAsync方法.在Identity 1.0中,可以从UserManager.PasswordResetTokens.Validate方法获取UserId((UserManager.PasswordResetTokens.Validate(token)).UserId).现在它已经消失,所有现有的例子都告诉我,我需要向用户询问用户名或电子邮件.这不是用户友好的,如果令牌有效,我不希望我的用户再次输入用户名.
这已经是ASP.NET身份中已经建立的传统 - 以前工作的东西在新版本中被破坏了.当然我可以使用嵌入式UserId创建自己的组合令牌,但为什么我需要做额外的工作呢?新版本应该改进,而不是让它们变得更糟.
Asp.Net Identity 2.x 不提供通过从GeneratePasswordResetTokenAsync 方法创建的令牌查找用户的方法。
您有两个选择:
1) 在您将发送给用户的 url 中添加用户 ID。前任:
var token = await _userManager.GeneratePasswordResetTokenAsync(applicationUser);
var callbackUrl = $"/reset-password/?user={WebUtility.UrlEncode(applicationUser.Id)}&code={WebUtility.UrlEncode(token)}";
Run Code Online (Sandbox Code Playgroud)
这种方法更加用户友好。但我知道有人说这是一个安全问题,因为知道该链接的任何人都可以重置用户密码。
2) 在重置密码页面询问用户名,就像您所做的那样。前任:
public async Task<YourResultModel> ResetPassword(ResetPasswordViewModel vm)
{
// Your password validations...
var user = await _userManager.FindByNameAsync(vm.UserName);
// could be FindByEmailAsync if your app uses the user e-mail to login.
IdentityResult result = await _userManager.ResetPasswordAsync(user, vm.Token, vm.NewPassword);
return YourResultModelFromIdentityResult(result);
}
Run Code Online (Sandbox Code Playgroud)
在这两种方法之间进行选择之前,您需要考虑您的具体场景。例如:如果您的应用程序使用用户电子邮件作为用户名,并拦截“拦截器”访问用户电子邮件箱所需的令牌,则从重置密码链接中删除用户 ID 不会提高应用程序的安全性。因为拥有链接的人已经知道用户的电子邮件。
| 归档时间: |
|
| 查看次数: |
1055 次 |
| 最近记录: |