首页 > 解决方案 > 尝试使用 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");
        }
    }
}

标签: asp.netasp.net-core.net-corerazorrazor-pages

解决方案


用这段代码试试:

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

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.identity.usermanager-1.updatepasswordhash?view=aspnetcore-5.0

var result = await _userManager.UpdatePasswordHash(user, NewPassword, true|false);

推荐阅读