我需要能够通过管理员更改用户的密码.因此,管理员不应输入用户的当前密码,他应该有能力设置新密码.我查看ChangePasswordAsync方法,但此方法需要输入旧密码.因此,此方法不适合此任务.因此我通过以下方式制作:
[HttpPost]
public async Task<ActionResult> ChangePassword(ViewModels.Admin.ChangePasswordViewModel model)
{
var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
var result = await userManager.RemovePasswordAsync(model.UserId);
if (result.Succeeded)
{
result = await userManager.AddPasswordAsync(model.UserId, model.Password);
if (result.Succeeded)
{
return RedirectToAction("UserList");
}
else
{
ModelState.AddModelError("", result.Errors.FirstOrDefault());
}
}
else
{
ModelState.AddModelError("", result.Errors.FirstOrDefault());
}
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
它有效,但理论上我们可以在AddPasswordAsync方法上收到错误.因此,旧密码将被删除,但未设置新密码.这不好.有什么方法可以在"一次交易"中做到吗?PS.我看到ResetPasswordAsync方法带有重置令牌,似乎,它更安全(因为不能与用户不稳定的情况)但无论如何,它通过2个动作.
我想知道如果有一种方法与重置密码UserManager的ASP.NET MVC 5
我尝试使用已经有密码但没有成功的用户.任何线索?
IdentityResult result = UserManager.AddPassword(forgotPasswordEvent.UserId.ToString(), model.ConfirmPassword);
if (result.Succeeded)
{
//
}
else
{
AddErrors(result);
}
Run Code Online (Sandbox Code Playgroud) 当用户忘记密码时,我想知道什么是更安全的选择
要么
除了后者使用额外的桌子之外,您认为更安全/更好的做法是什么?
关于如何构建重置密码令牌的最佳实践?我在想:
随机17个字符[a-zA-Z0-9] +全局唯一id +随机17个字符[a-zA-Z0-9].
是否有更好的解决方案,或重置密码令牌的行业标准?
我在nodejs中使用passportjs来创建登录系统.一切都很好,但我不知道如何在忘记密码或想要更改密码时重置用户密码.
MongoDB中的用户模型
var UserSchema = new Schema({
email: String,
username: String,
provider: String,
hashed_password: String,
salt: String,
});
Run Code Online (Sandbox Code Playgroud)
提前致谢!
我有一个带有 2 个输入字段的重置密码表单:
我必须创建一个验证,其中“新密码(确认)需要与“新密码”匹配,并且我做到了。当您在“新密码(确认)字段中输入错误的密码时,它会给出错误并且不会让您提交表单,直到它与“新密码”字段中的密码匹配。但是,如果我返回并更改“新密码”字段,“新密码(确认)字段显示它仍然匹配,即使它们不再匹配......所以我的问题是:我该如何解决这个问题?
任何建议表示赞赏
.ts 文件
import { AbstractControl, FormBuilder, FormControl, Validators } from '@angular/forms';
import { AppConfig } from 'src/app/_common/configs/app.config';
import { Component } from '@angular/core';
@Component({
selector: 'app-reset-password',
templateUrl: './reset-password.component.html',
styleUrls: ['./reset-password.component.scss'],
})
export class ResetPasswordComponent {
passwordsMatching = false;
isConfirmPasswordDirty = false;
confirmPasswordClass = 'form-control';
appConfig = AppConfig;
newPassword = new FormControl(null, [
(c: AbstractControl) => Validators.required(c),
Validators.pattern('^((?!.*[s])(?=.*[A-Z])(?=.*d).{8,99})'),
]);
confirmPassword = new FormControl(null, [
(c: AbstractControl) => Validators.required(c),
Validators.pattern('^((?!.*[s])(?=.*[A-Z])(?=.*d).{8,99})'),
]);
resetPasswordForm = this.formBuilder.group({
newPassword: …Run Code Online (Sandbox Code Playgroud) 我正在使用 Keycloak,我想启用忘记密码流程。我已启用“登录时忘记密码”并配置 SMTP 来发送电子邮件。我从 keycloak 中得到的内容如下
-> 单击“忘记密码”链接 -> 输入用户名或电子邮件 -> 用户收到一封包含重置链接的电子邮件 -> 单击该链接 -> 重置密码,然后提交 ->用户登录,然后用户将被重定向到帐户页面。
我想要达到的目标如下
-> 单击“忘记密码”链接 -> 输入用户名或电子邮件 -> 用户收到一封包含重置链接的电子邮件 -> 单击该链接 -> 重置密码,然后提交 -> 显示一条消息“您的密码已更新”。并且不要登录该用户。留在该页面上。
原因是,对于我的用例,用户不应该访问 Keycloak 上的帐户页面。
在重置凭据的身份验证流程中,我只能配置最多重置凭据。
有什么方法可以禁用密码重置后自动登录用户然后重定向到帐户页面的操作吗?
我研究了几个问题,但找不到如何实现这一目标的答案。
PS:我正在使用具有自定义主题的 Keycloak docker 映像。如果可以使用自定义主题选项进行配置,我就有机会这样做。
先感谢您。
authentication redirect forgot-password reset-password keycloak
关于在SO上恢复密码有很多问题,但是考虑到以下两种情况之一,没有关于更改密码的问题:
1)用户已经在系统中进行了身份验证(通过用户/ pw或通过第三方认证,例如facebook/twitter)
2)用户知道他或她的旧密码.
鉴于这些起点,我有两个截然不同的问题,即允许用户以最少的步骤更改其密码的最佳做法是什么.
场景(用户已经过身份验证并登录系统):
输入旧密码:_ __ _ __ _ (1:我可以摆脱这个)
输入新密码:_ __ _ __ _
再次输入新: _ __ _ __ _ ( 2:我可以摆脱这个)
1)没有用户输入旧密码是否可以?在这种情况下,我假设用户已经在系统中进行了身份验证.让用户重新输入密码似乎是多余的.我理解这对于高安全性应用程序(例如银行业务)来说非常重要,其中用户离开会话无人看管可能允许某人输入新密码而不知道让他们进入这种情况的密码.
在我提出的示例中,应用程序的安全性不是很高,风险也很低.此外,由于我们允许第三方认证(facebook/twitter),理论上如果其他人在机器上并且用户有facebook/twitter的实时cookie,他们可以进入该帐户.
2)没有用户输入两次新密码是否可以.这感觉有点像90年代.人们现在已经习惯了密码,他们输入密码的可能性比他们预期的要大5%,这似乎并没有超过两次输入密码的时间.在5%的情况下,最糟糕的情况是他们只需重置密码(或者只需登录facebook/twitter并重置密码).我发现现在这样做的一个网站是Quora(尽管他们仍然执行第1步).我没有看到很多其他人也这样做.
我们正在使用 keycloak 实现身份验证。专门针对忘记密码选项:当用户点击忘记密码选项,并提供用户名时,将向他们的ID发送一封电子邮件,其中包含重置密码的链接。
我的问题特别是在链接上:电子邮件中发送的链接如下所示: https://:/auth/realms//login-actions/reset-credentials?code= 但提到的实际上是一个内部物理主机名可以在/etc/hosts中找到,但是外部用户无法访问,所以我们需要替换这个host:port号。
.ftl 文件中的代码在 themes/base/email/html/password-reset.ftl 下如下所示: ${msg("passwordResetBodyHtml",link, linkExpiration, realmName)} 虽然从管理控制台中找出了linkExpiration 和 realmName(它们在管理控制台中的 Realm Settings 下),我无法找出“链接”的配置方式和位置。有人可以帮忙吗?
我查找了其他线程并做了一些发现,并找到了这个链接:( Keycloak - 代理后面的 URL 重置密码电子邮件,但它确实谈到了 NginX 代理,我们还没有配置它。