正如微软在其网站上所说: 安全印章:
每当用户凭据更改(密码更改、登录删除)时都必须更改的随机值
我正在编写一个操作,管理员可以手动更改用户密码:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ForgotPassword(string userId, string newPassword)
{
var user = await _userManager.FindByIdAsync(userId);
if (user == null)
{
TempData.Put("M", new ResultMessage
{
CssClassName = "alert alert-danger alert-dismissible",
Title = "Failed!",
Message = "User not found!"
});
return RedirectToAction("Index");
}
string resetToken = await _userManager.GeneratePasswordResetTokenAsync(user);
var result = await _userManager.ResetPasswordAsync(user, resetToken, newPassword);
if (result.Succeeded)
{
var ress = await _userManager.UpdateSecurityStampAsync(user); //Is this step necessary?
if (ress.Succeeded)
{
TempData.Put("M", new ResultMessage
{
CssClassName = "alert alert-success alert-dismissible",
Title = "Success!",
Message = "Password updated successfully!"
});
return RedirectToAction("Index");
}
TempData.Put("M", new ResultMessage
{
CssClassName = "alert alert-danger alert-dismissible",
Title = "Failed!",
Message = "Failed at the security stamp step!"
});
return RedirectToAction("Index");
}
TempData.Put("M", new ResultMessage
{
CssClassName = "alert alert-danger alert-dismissible",
Title = "Failed!",
Message = "Failed to reset password!"
});
return RedirectToAction("Index");
}
并每 15 分钟验证一次安全标记,以强制用户在更改密码时注销,如下所示:
services.Configure<SecurityStampValidatorOptions>(options =>
options.ValidationInterval = TimeSpan.FromMinutes(15)
);
我是否必须在每次更改密码时生成新的安全标记,还是由用户管理器自动完成?
使用 ASP.Net Core 2.2
我也想知道同样的事情。 文档声明:
调用
强制现有cookie在下次检查时失效。大多数身份UI帐户和管理页面在更改密码或添加登录名后都会调用userManager.UpdateSecurityStampAsync(user)
userManager.UpdateSecurityStampAsync(user)
但是在密码重置后不会调用的“默认身份用户界面”中。这很令人困惑。
正如@stuartd上面评论的那样,
UserManager.ResetPasswordAsync
调用UpdatePasswordHash
,它调用UpdateSecurityStampInternal。
如果手动调用
userManager.UpdateSecurityStampAsync
,它会调用 UpdateSecurityStampInternal。
所以它做了同样的事情,但我不会依赖未记录的内部实现。
“默认身份用户界面”在多个方面都缺乏。我认为编写 UI 部分的人也编写了身份机制,因此了解实现细节。我们不应该做出这样的假设。
所以我会再做一次以确定。