繁体   English   中英

Asp.Net Core 扩展身份

[英]Asp.Net Core extending Identity

我有一个更高级而不是语法的问题。

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

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

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

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

按照这种方式,我担心我可能需要找到一种方法来拥有一个不会覆盖加密密码的“编辑”视图,或者要求管理员在需要更改其他内容时随时更改用户密码(例如更改他们的部门,或授予他们访问网站部分的权限)。

所以现在我想知道是否有更好的方法我应该去完成这个。

建议? 推荐?

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

你需要确保你没有过度发布 使用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 用于 Identity。 而是使用 UserManager 等的现有功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM