C# 用户如何使用ASP.NET标识在ASP.NET Core 2应用程序中删除自己?
我正在使用ASP.NET Core 2.0探索ASP.NET标识,如下所示。一旦用户注册了自己,似乎就没有机制让他们删除自己的帐户。AccountController.cs文件未提及删除C# 用户如何使用ASP.NET标识在ASP.NET Core 2应用程序中删除自己?,c#,asp.net-core,asp.net-identity,asp.net-core-2.0,C#,Asp.net Core,Asp.net Identity,Asp.net Core 2.0,我正在使用ASP.NET Core 2.0探索ASP.NET标识,如下所示。一旦用户注册了自己,似乎就没有机制让他们删除自己的帐户。AccountController.cs文件未提及删除 用户应该能够删除其帐户,不仅是因为删除,而且可能会受到限制,例如,由于法律原因,他们的购买记录必须保留若干年。那么,实现用户自删除的最佳方式是什么呢?正是由于您指出的原因,大多数网站实际上不允许用户自删除。即使他们有办法删除或删除您的帐户,实际发生的情况是,这是一个删除或删除帐户的请求。这意味着要么有一个实时的
用户应该能够删除其帐户,不仅是因为删除,而且可能会受到限制,例如,由于法律原因,他们的购买记录必须保留若干年。那么,实现用户自删除的最佳方式是什么呢?正是由于您指出的原因,大多数网站实际上不允许用户自删除。即使他们有办法删除或删除您的帐户,实际发生的情况是,这是一个删除或删除帐户的请求。这意味着要么有一个实时的人工干预,要么有一个自动化的流程,以流程批准的方式处理
换句话说,您不允许用户对其用户记录发出删除查询。您可以稍后处理他们的请求,确保在实际从数据库中删除任何内容之前归档或以其他方式保留任何必要的记录。我不是安全专家,因此我很想了解我的解决方案的组成部分。在ASP.NET Core 2.1中,模板将包括一个自删除选项,以符合GDPR要求。这几乎肯定会比下面的更好 我采取的策略是要求用户在删除帐户时再次输入密码 首先在Models/ManageViewModels文件夹中创建ViewModel: 实际上并不需要[Editablefalse],但它使几个月后查看代码时更容易理解 在ManageController.cs文件中添加两个操作:
[HttpGet]
public async Task<IActionResult> UserSelfDelete()
{
var user = await _userManager.GetUserAsync(User);
if (user == null)
{
throw new ApplicationException($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
}
// Validate business rules to ensure self-deletion is allowed, though it would
// be a good idea to tell the user why their account cannot be deleted
var userSelfDelete = new UserSelfDeleteViewModel
{
Email = user.Email,
UserName = user.UserName
};
return View(userSelfDelete);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> UserSelfDelete(UserSelfDeleteViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
var user = await _userManager.GetUserAsync(User);
if (user == null)
{
throw new ApplicationException($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
}
if (await _userManager.CheckPasswordAsync(user, model.Password) == false)
{
ModelState.AddModelError("Password", "Incorrect password entered");
return View(model);
}
await _signInManager.SignOutAsync();
_logger.LogInformation("User logged out prior to account deletion.");
await _userManager.DeleteAsync(user);
return RedirectToAction(nameof(HomeController.Index), "Home");
}
现在导航需要整理。在ManageNavPages.cs文件中添加以下行:
public static string UserSelfDelete => "UserSelfDelete";
public static string UserSelfDeleteClass(ViewContext viewContext) => PageNavClass(viewContext, UserSelfDelete);
最后,在_ManageNav.cshtml中添加以下链接:
<li class="@ManageNavPages.UserSelfDeleteClass(ViewContext)"><a asp-action="UserSelfDelete">Delete this account</a></li>
我过去就是这样做的:没有任何东西会立即被删除,但我的感觉是GDPR已经改变了这一点。自从我发表这篇文章以来,ASP.NET Core 2.1路线图已经发布,在“GDPR的改进”下,它声明模板将包括“允许用户下载个人数据的UI,以及完全删除其帐户的能力”。我已经制定了一个临时解决方案,我将在适当的时候发布。ASP.NET Core Identity 2.1有一个内置的表单,允许用户下载他们的个人数据或完全删除他们的帐户,所以这是新项目应该考虑的。
public static string UserSelfDelete => "UserSelfDelete";
public static string UserSelfDeleteClass(ViewContext viewContext) => PageNavClass(viewContext, UserSelfDelete);
<li class="@ManageNavPages.UserSelfDeleteClass(ViewContext)"><a asp-action="UserSelfDelete">Delete this account</a></li>