直接从 DB 与 UserManager 中获取 AspNet 用户是不好的做法吗?

Is it bad practice to Fetch AspNet User directly from DB vs UserManager?

  1. 使用 userManager.FindByUsernameAsync() 比直接从数据库获取用户有什么优势?

  2. 使用 UserManager 更安全吗? var user = await UserManager.FindByNameAsync(userName);

UserManager是一种抽象数据层的方法。通过在容器级别设置身份,您允许 UserManager 针对 IUserStore.

进行操作

例如,您可以看到 UserStore 最终会执行一些额外的任务(如加载声明、登录和角色)。它还匹配上层(因此可以使用规范化名称)和当前文化 - 您希望通过直接数据库查找处理自己的详细信息。

https://github.com/aspnet/AspNetIdentity/blob/master/src/Microsoft.AspNet.Identity.EntityFramework/UserStore.cs#L400

此外,UserManager 可能更容易测试,因为您不必担心将 InMemory 用于 Entity Framework:

var userManager = new Mock<UserManager<User>>(
    Mock.Of<IUserStore<User>>(),
    Mock.Of<IOptions<IdentityOptions>>(),
    Mock.Of<IPasswordHasher<User>>(),
    new List<IUserValidator<User>>(),
    new List<IPasswordValidator<User>>(),
    Mock.Of<ILookupNormalizer>(),
    new IdentityErrorDescriber(),
    Mock.Of<IServiceProvider>(),
    Mock.Of<ILogger<UserManager<User>>>());

与任何自以为是的库一样,Identity 提供 UserManagerRoleManager 作为数据访问的有用抽象,可以方便地执行许多有用的任务(完全避免注入数据库)。此外,如果您发现自己需要执行这些管理器未提供的某些 user/role 相关功能,则可能是反模式的标志。

更新:

关于安全性:UserManager 安全性取决于您在容器中设置的数据库连接。换句话说,你在加密你的连接字符串吗?您与数据库的通信是否通过安全连接?无论您是在 UserManager 中抽象您的数据库连接还是直接注入您的数据库上下文,所有典型的数据库安全问题都将保持不变。但我认为安全的数据库访问完全是另一个问题。

UserManager 中有一些方法,您肯定希望将其用于安全隐患 - 特别是密码 creation/management(CheckPasswordAsyncAddPasswordAsync 等) .但这些最终取决于 IPasswordHasherIPasswordValidator 的哪些实现被注入 UserManager。您的问题似乎与简单的数据查找有关,因此这也是一个单独的问题。