【问题标题】:Trying to update my users password using AddPasswordAsync but passwords always left as null尝试使用 AddPasswordAsync 更新我的用户密码,但密码始终保留为空
【发布时间】:2021-07-25 21:39:19
【问题描述】:

所以我有 2 个表,一个用于编辑用户角色,一个用于编辑用户帐户,角色表允许我完美地删除和添加角色,但我在更新密码时遇到问题。密码似乎已被删除,但未使用指定的新密码进行更新。

<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");
        }
    }
}

【问题讨论】:

  • @RyanWilson 这似乎是 Razer Pages,而不是 mvc
  • 是的,它的剃刀不是 mvc
  • 使用方法ResetPassword怎么样?

标签: asp.net asp.net-core .net-core razor razor-pages


【解决方案1】:

用这段代码试试吧:

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);

【讨论】:

    猜你喜欢
    • 2019-06-29
    • 2017-03-06
    • 2016-08-22
    • 2011-02-20
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    相关资源
    最近更新 更多