每当用户请求更改密码时,我是否必须手动更新安全标记,或者由用户管理器自动处理?

问题描述 投票:0回答:1

正如微软在其网站上所说: 安全印章:

每当用户凭据更改(密码更改、登录删除)时都必须更改的随机值

我正在编写一个操作,管理员可以手动更改用户密码:

 [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

c# asp.net-core asp.net-identity
1个回答
0
投票

我也想知道同样的事情。 文档声明

调用

userManager.UpdateSecurityStampAsync(user)
强制现有cookie在下次检查时失效。大多数身份UI帐户和管理页面在更改密码或添加登录名后都会调用
userManager.UpdateSecurityStampAsync(user)

但是在密码重置后不会调用的“默认身份用户界面”中。这很令人困惑。

正如@stuartd上面评论的那样,

UserManager.ResetPasswordAsync
调用
UpdatePasswordHash
,它调用UpdateSecurityStampInternal

如果手动调用

userManager.UpdateSecurityStampAsync
,它会调用 UpdateSecurityStampInternal

所以它做了同样的事情,但我不会依赖未记录的内部实现。

“默认身份用户界面”在多个方面都缺乏。我认为编写 UI 部分的人也编写了身份机制,因此了解实现细节。我们不应该做出这样的假设。

所以我会再做一次以确定。

© www.soinside.com 2019 - 2024. All rights reserved.