【问题标题】:Asp.Net Core extending IdentityAsp.Net Core 扩展身份
【发布时间】:2019-02-19 16:34:38
【问题描述】:

我有一个比语法更高级的问题。

简而言之,我正在构建一个 Asp.Net Core Web 应用程序(使用 MVC,使用内置用户身份验证)。

我正在扩展现有的 Identity 实体以添加我们需要的属性(在 Identity/ApplicationUser 对象中尚不存在)。

最终,我需要管理员能够/将进入页面(视图)以设置新用户或另一个页面(视图),管理员可以在其中修改任何属性(密码/登录名除外)对于现有用户。

现在我正在努力让这项工作正常进行(我修改了生成的注册视图以用作“设置新用户”视图并让所有这些工作正常进行),我现在正在努力编辑视图,我意识到我可能走错了路。

这样下去,我担心我可能需要想办法让编辑视图不会覆盖加密的密码,或者要求管理员在需要更改的任何时候更改用户的密码其他事情(例如,改变他们的部门,或授予他们访问网站某些部分的权限)。

所以现在我想知道是否有更好的方法来完成这项工作。

建议?推荐?

我现在重新开始这部分内容还不算太晚。

【问题讨论】:

  • 他们为什么需要修改密码?从该视图中取出密码字段并将其放入正确的重置/更改密码视图中
  • 这就是我的意思——我不希望管理员能够修改其中一个用户的密码(他们会改为使用“我忘记密码”视图)——但我是'不确定我是否可以对控制器进行编码,使其不会在管理员进行另一项更改时使用任何默认值覆盖密码。
  • @Scott 我的回答对你有帮助吗?
  • @RuardvanElburg 对不起,我打算将您的答案标记为一周前的答案(我实际上以为我做了 - 哎呀)。

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


【解决方案1】:

您需要确保您不是overposting。使用 TryUpdateModel 来更新具有发布值的字段是一种安全最佳实践,因为它可以防止过度发布。

例如,假设 Student 实体包含一个 Secret 属性 该网页不应更新或添加。即使应用程序没有 在创建/更新 Razor 页面上有一个 Secret 字段,黑客可以 通过过度发布设置 Secret 值。黑客可以使用诸如 Fiddler 或编写一些 JavaScript 来发布 Secret 表单值。这 原始代码不限制模型绑定器在何时使用的字段 它创建一个 Student 实例。无论黑客为 Secret 表单字段指定的值是什么 在数据库中更新。

使用 TryUpdateModel 防止过度发布的示例:

public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
        return Page();

    var emptyStudent = new Student();

    if (await TryUpdateModelAsync<Student>(
        emptyStudent,
        "student",   // Prefix for form value.
        s => s.FirstMidName, s => s.LastName, s => s.EnrollmentDate))
    {
        _context.Student.Add(emptyStudent);
        await _context.SaveChangesAsync();
        return RedirectToPage("./Index");
    }
    return null;
}

我个人从不使用实体对象,而是使用 ViewModels。最肯定的是,当涉及到身份时。首先要保持关注点分开。作为一个好处,事情会变得容易得多。虽然这样的事情不太可能发生过度张贴。

对于管理员,您可以使用替代的 TryUpdateModel。但我不会将 CRUD 用于身份。而是使用来自 UserManager 等的现有功能。

【讨论】:

    猜你喜欢
    • 2021-03-21
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    相关资源
    最近更新 更多