【问题标题】:How can a user delete themselves in an ASP.NET Core 2 app using ASP.NET Identity?用户如何使用 ASP.NET Identity 在 ASP.NET Core 2 应用程序中删除自己?
【发布时间】:2018-02-02 16:57:34
【问题描述】:

我正在按照this example 使用 ASP.NET Core 2.0 探索 ASP.NET Identity。一旦用户注册了自己,他们似乎没有任何机制可以删除他们的帐户。 AccountController.cs 文件没有提及删除。

用户应该能够删除他们的帐户,尤其是因为GDPR,但删除可能会受到限制,例如他们有购买记录,出于法律原因必须保存多年。那么实现用户自删除的最佳方式是什么?

【问题讨论】:

  • ASP.NET Core Identity 2.1 有一个内置表单,允许用户下载他们的个人数据或完全删除他们的帐户,所以这就是你应该在新项目中寻找的内容。

标签: c# asp.net-core asp.net-identity asp.net-core-2.0


【解决方案1】:

我不是安全专家,所以我有兴趣了解我的解决方案是什么。在 ASP.NET Core 2.1 中,模板将包含一个自删除选项以符合 GDPR 要求。这几乎肯定会比以下更好。

我采取的策略是要求用户在删除帐户时再次输入密码。

首先在Models/ManageViewModels文件夹中创建一个ViewModel:

public class UserSelfDeleteViewModel
{
    [Editable(false)]
    [Display(Name = "Email address")]
    public string Email { get; set; }

    [Editable(false)]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [Display(Name = "Password")]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

[Editable(false)] 实际上并不是必需的,但它可以让您在数月后查看代码时更容易理解。

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

这现在需要Manage 文件夹中的视图。我想显示电子邮件地址和用户名,但已将它们设为只读:

@model UserSelfDeleteViewModel
@{
    ViewData["Title"] = "Delete this account";
}

<h4>@ViewData["Title"]</h4>
<div class="row">
    <div class="col-md-6">
        <form method="post">
            <div class="form-group">
                <label asp-for="Email"></label>
                <input asp-for="Email" class="form-control" readonly="readonly" />
            </div>
            <div class="form-group">
                <label asp-for="UserName"></label>
                <input asp-for="UserName" class="form-control" readonly="readonly" />
            </div>
            <div class="form-group">
                <label asp-for="Password"></label>
                 <input asp-for="Password" class="form-control" autocomplete="new-password" autofill=""/>
                <span asp-validation-for="Password" class="text-danger"></span>
            </div>
            <button type="submit" class="btn btn-default">Delete your account</button>
        </form>
    </div>
</div>

@section Scripts {
    @await Html.PartialAsync("_ValidationScriptsPartial")
}

现在导航需要整理。在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>

【讨论】:

    【解决方案2】:

    正是由于您指出的原因,大多数网站实际上并没有让用户自行删除。即使他们有办法“删除”或“删除”您的帐户,实际发生的情况是删除或删除帐户是一个请求。这意味着要么有现场人工干预,要么有一些自动化流程以流程批准的方式处理它。

    换句话说,您不能让用户从字面上对他们的用户记录发出 DELETE 查询。您稍后处理他们的请求,确保在实际从数据库中删除任何内容之前存档或以其他方式保留任何必要的记录。

    【讨论】:

    • 这就是我过去做事的方式:没有任何东西被立即删除,但我的感觉是 GDPR 改变了这一点。自从我发表这篇文章以来,ASP.NET Core 2.1 路线图已经发布,并且在“GDPR 改进”下声明模板将包括“允许用户下载其个人数据的 UI,以及完全删除其帐户的能力” '。我已经制定了一个临时解决方案,我将在适当的时候发布。
    猜你喜欢
    • 2018-01-21
    • 2016-10-03
    • 1970-01-01
    • 2021-12-20
    • 2020-05-08
    • 1970-01-01
    • 2018-12-16
    • 2015-03-19
    • 2017-02-17
    相关资源
    最近更新 更多