如何在 ASP.NET Core Identity 中使用重置密码为未使用身份登录的用户创建密码

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

我正在开发一个已有近 18 年历史的遗留 ASP.NET Webforms 应用程序。它使用简单的基于表单的身份验证,其中用户输入用户名/密码,然后通过匹配

Users
表中保存的用户名/密码来对用户进行身份验证。

现在我的任务是创建一个单独的 ASP.NET Core 6.0 应用程序,其中包含身份和剃刀页面,该应用程序将用于登录上述旧网站并使用双因素身份验证。

我已经使用迁移创建了所有身份表,例如

AspNetUsers
。我还将旧 Users 表中的所有行移至此
AspNetUsers
表。

现在,当老用户尝试登录时,我将检查用户名是否存在以及是否与他们输入的旧密码匹配。之后,我想将他们引导至

ChangePassword.cshtml
razor 页面。可能不应该要求用户输入旧密码,因为旧应用程序和 ASP.NET Core Identity 使用的加密方式会有所不同。

当他们输入密码并确认密码文本框时,密码应该更新,他们现在可以使用 ASP.NET Core Identity 登录。我想知道如何实现这一目标。非常感谢任何帮助。

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

要实现将用户从旧的 ASP.NET WebForms 应用程序迁移到具有身份和 Razor 页面的新 ASP.NET Core 6.0 应用程序并允许他们无缝更改密码的目标,您可以按照以下步骤操作:

登录流程:

当用户尝试使用旧凭据登录时,请根据旧用户表验证其用户名/密码。 如果凭据有效,则将用户重定向到 ChangePassword Razor 页面,并使用唯一标识符(例如用户 ID 或用户名)作为查询参数。

更改密码 Razor 页面:

在 ASP.NET Core 应用程序中创建 ChangePassword Razor 页面,用户在尝试登录成功后将被定向到该页面。 从查询参数中提取唯一标识符。 显示包含新密码和密码确认字段的表单。

密码更新:

提交表单后,验证新密码(例如,确保其满足复杂性要求)。 使用 ASP.NET Core Identity 的哈希算法对新密码进行哈希处理。 更新 AspNetUsers 表中相应用户的密码。 确保更新用户的安全标记以使现有身份验证令牌无效。 成功更新密码后,使用 ASP.NET Core Identity 的 SignInManager 对用户进行身份验证。 将用户重定向到应用程序的安全区域。

以下是如何实施这些步骤的基本示例:

// Inside your ChangePassword Razor Page
@page
@model ChangePasswordModel

<form asp-page-handler="ChangePassword" method="post">
    <label>New Password:</label>
    <input type="password" asp-for="NewPassword" />
    <label>Confirm Password:</label>
    <input type="password" asp-for="ConfirmPassword" />
    <button type="submit">Change Password</button>
</form>

// ChangePassword.cshtml.cs
public class ChangePasswordModel : PageModel
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;

    public ChangePasswordModel(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager)
    {
        _userManager = userManager;
        _signInManager = signInManager;
    }

    [BindProperty]
    public string NewPassword { get; set; }

    [BindProperty]
    public string ConfirmPassword { get; set; }

    public async Task<IActionResult> OnPostChangePasswordAsync(string userId)
    {
        if (ModelState.IsValid)
        {
            var user = await _userManager.FindByIdAsync(userId);
            if (user != null)
            {
                // Update password and security stamp
                var token = await _userManager.GeneratePasswordResetTokenAsync(user);
                var result = await _userManager.ResetPasswordAsync(user, token, NewPassword);

                if (result.Succeeded)
                {
                    // Sign in the user with the new password
                    await _signInManager.SignInAsync(user, isPersistent: false);
                    return RedirectToPage("/Index"); // Redirect to secure area
                }
            }
        }
        return Page();
    }
}

在此示例中,ChangePasswordModel 包含更改密码的逻辑。 OnPostChangePasswordAsync 方法处理表单提交并更新数据库中的用户密码。成功更新密码后,用户将使用 SignInManager 登录。根据需要调整此代码以满足您的特定要求和用户管理设置。

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