[英]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.