我正在开发一个已有近 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 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 登录。根据需要调整此代码以满足您的特定要求和用户管理设置。