不使用 UserManager 来创建或更新 AspNetUsers 有缺点吗?

Is there a downside not using UserManager to create or update AspNetUsers?

网上看到的推荐方法好像都是用UserManager<TUser>.CreateAsync()方式创建用户

仅使用 ef core dbContext 的缺点是什么?

假设我在 AspNetUsers 中有一个 TimeZoneInfoId 列。

 public class ApplicationUser : IdentityUser
    {
        public string? TimeZoneInfoId { get; set; }
    }

用dbContext更新不好吗?

例如:

using var dbContext = await DbContextFactory.CreateDbContextAsync();
var userToUpdate = await dbContext.ApplicationUsers.Where(u => u.UserName == "John").FirstOrDefaultAsync();
userToUpdate?.TimeZoneInfoId = "Samoa Standard Time";
await dbContext.SaveChangesAsync();

或者这样做完全没问题吗?

首先,UserManger是另一个抽象层次。通常它与 EF-based 用户存储一起使用,但您可以实现任何您想要的存储。

因此,如果您使用 UseManager project-wide 并且在某个开发阶段您决定要将当前 EF-based 用户存储切换到其他内容,唯一要做的就是替换 IUserStore 在你的 UserManager 中。如果你按照你提供的方式(直接调用 db) - 你应该重构你管理用户的每个地方。

用户管理器关心更多的事情,例如:更新安全标记/规范化或验证 - 知道这一点非常重要,您可以修改 UserManager 的每个方面 - 您唯一需要做的事情要做的是将 UserManager 抽象切换到另一个抽象 - 就像 IUserStore.

的情况一样

总而言之,UserManager 工作就像许多组件的好粘合剂,让您可以管理用户。默认情况下,它使用良好的默认实现,但您可以根据需要轻松调整它。

这里解释一下为什么我们选择使用 UserManagerRoleManager

ASP.NET Core Identity:

Is an API that supports user interface (UI) login functionality.

Manages users, passwords, profile data, roles, claims, tokens, email confirmation, and more.

这不仅仅是数据库访问。它还是管理登录功能、安全令牌创建、安全密码管理等的代码。

如果你创建一个自定义系统,你需要考虑以上所有因素,有一个外部审计员来pen-test你的解决方案(尽管无论你做出什么选择,这都是一个好主意),单元测试、性能测试等

以上都已经完成了。您也可以使用各种挂钩点轻松自定义身份。

顺便说一句,默认情况下身份已经使用 ef 访问数据存储。

构建您的多层应用程序,但将身份排除在外。这是一个横向关注点,它的存在是为了简化您的开发,让您只担心您的业务需求。

在代码中定义bad非常困难,但userManager为开发者提供了更方便、高效、安全的选择。

参考