asp.net - 尝试使用 AddPasswordAsync 更新我的用户密码,但密码始终保留为空
问题描述
所以我有两张表,一张用于编辑用户角色,一张用于编辑用户帐户,角色表允许我完美地删除和添加角色,但我在更新密码时遇到了麻烦。密码似乎已被删除,但未使用指定的新密码进行更新。
<br>
<h3>Roles Table</h3>
<table class="table table-striped">
<thead>
<tr> <th>Id</th><th>User Roles</th> </tr>
</thead>
<tbody>
@foreach (var roles in Model.roles)
{
<tr>
<td> @roles.Id</td>
<td> @roles.Name</td>
<td><a class="btn btn-sm btn-danger order-button float-right" asp-page="/ManageRoles" asp-route-id="Delete" asp-page-handler="Delete">Delete Roles </a></td>
</tr>
}
</tbody>
</table>
<form method="post">
<div class="flex">
<div>
<button type="submit" class="btn btn-primary">Submit</button>
</div>
<div class="input-group">
<input type="text" class="form-control" asp-for="@Model.roleName">
</div>
</div>
</form>
<table class="table table-striped" style="margin-top: 100px;">
<thead>
<tr> <th>Id</th><th>User Account</th> </tr>
</thead>
<tbody>
@foreach (var users in Model.users)
{
<tr>
<td> @users.Id</td>
<td> @users.Email</td>
<td><a class="btn btn-sm btn-danger order-button float-right" asp-page="/ManageRoles" asp-route-id="DeleteUser" asp-page-handler="DeleteUser">Delete User </a></td>
<td>
<form method="post" asp-page-handler="Update" asp-route-id="@users.Id">
<div class="input-group">
<input type="text" class="form-control" asp-for="@Model.NewPassword">
<button type="submit" class="btn btn-default">Update Password </button>
</div>
</form>
</td>
</tr>
}
</tbody>
</table>
所以下面是我的页面模型类
{
private readonly RoleManager<IdentityRole> _roleManager;
private readonly UserManager<AppUser> _userManager;
public List <IdentityRole> roles { get; set; }
[BindProperty(SupportsGet = true)]
public string Id { get; set; }
[BindProperty]
public string roleName { get; set; }
public List <AppUser> users { get; set; }
[BindProperty]
public string userId { get; set; }
[BindProperty]
public string NewPassword { get; set; }
public AdminDashboardModel(RoleManager<IdentityRole> roleManager, UserManager<AppUser> userManager)
{
_roleManager = roleManager;
_userManager = userManager;
}
public void OnGet()
{
roles = _roleManager.Roles.ToList();
users = _userManager.Users.ToList();
}
public async Task <IActionResult> OnGetDeleteAsync()
{
var role = await _roleManager.FindByIdAsync(Id);
await _roleManager.DeleteAsync(role);
return RedirectToPage("/AdminDashboard");
}
public async Task<IActionResult> OnPostAsync()
{
if (roleName != null)
await _roleManager.CreateAsync(new IdentityRole(roleName.Trim()));
return RedirectToPage("/AdminDashboard");
}
public async Task<IActionResult> OnGetDeleteUserAsync()
{
var user = await _userManager.FindByIdAsync(Id);
await _userManager.DeleteAsync(user);
return RedirectToPage("/AdminDashboard");
}
public async Task<IActionResult> OnPostUpdateAsync()
{
var user = await _userManager.FindByIdAsync(Id);
await _userManager.RemovePasswordAsync(user);
await _userManager.AddPasswordAsync(user, NewPassword);
return RedirectToPage("/AdminDashboard");
}
}
}
解决方案
用这段代码试试:
public async Task<IActionResult> OnPostUpdateAsync()
{
var user = await _userManager.FindByIdAsync(Id);
var token = await _userManager.GeneratePasswordResetTokenAsync(user)
var result = await _userManager.ResetPasswordAsync(user, token, NewPassword);
//validate result
if(result.Succeeded) {
return RedirectToPage("/AdminDashboard");
}
//handle errors
throw new Exception()
}
您实际上不需要验证结果,但事情往往会横向发展。总是更好地进行错误处理。
生成的令牌验证对系统更改密码的操作。如果用户想重置他们的密码,因为他们忘记了密码,您还需要生成这样的令牌,将其发送到他们的电子邮件,然后让用户选择一个新密码。
或者,您可以只使用UserManager.UpdatePasswordHash
:
var result = await _userManager.UpdatePasswordHash(user, NewPassword, true|false);
推荐阅读
- angular - 预渲染 Angular 6(用于 SEO)不会将 routerLink 转换为 Href
- python - 如何在 Keras 中结合 LSTM 和 CNN 模型
- javascript - 如何按值对对象数组进行排序?
- python - 如何在 Django 中结合过滤和分页?
- c# - 为什么 MSBuild 有时会忽略 TargetFrameworkVersion?
- ansible - ansible - 无法访问嵌套列表中的项目
- python - 如何用百分比编写一个计算公式来用python构建一个金融计算器?
- java - Maven多模块依赖解析
- css - mat-tab-group 宽度对 flex 中的宽度 100% 容器没有反应
- azure-active-directory - Azure B2C 启用诊断日志以与请求订阅的日志分析集成,即使租户已经喜欢订阅