直接从 DB 与 UserManager 中获取 AspNet 用户是不好的做法吗?
Is it bad practice to Fetch AspNet User directly from DB vs UserManager?
使用 userManager.FindByUsernameAsync()
比直接从数据库获取用户有什么优势?
使用 UserManager 更安全吗?
var user = await UserManager.FindByNameAsync(userName);
UserManager
是一种抽象数据层的方法。通过在容器级别设置身份,您允许 UserManager
针对 IUserStore
.
进行操作
例如,您可以看到 UserStore
最终会执行一些额外的任务(如加载声明、登录和角色)。它还匹配上层(因此可以使用规范化名称)和当前文化 - 您希望通过直接数据库查找处理自己的详细信息。
此外,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 提供 UserManager
和 RoleManager
作为数据访问的有用抽象,可以方便地执行许多有用的任务(完全避免注入数据库)。此外,如果您发现自己需要执行这些管理器未提供的某些 user/role 相关功能,则可能是反模式的标志。
更新:
关于安全性:UserManager
安全性取决于您在容器中设置的数据库连接。换句话说,你在加密你的连接字符串吗?您与数据库的通信是否通过安全连接?无论您是在 UserManager
中抽象您的数据库连接还是直接注入您的数据库上下文,所有典型的数据库安全问题都将保持不变。但我认为安全的数据库访问完全是另一个问题。
UserManager
中有一些方法,您肯定希望将其用于安全隐患 - 特别是密码 creation/management(CheckPasswordAsync
、AddPasswordAsync
等) .但这些最终取决于 IPasswordHasher
和 IPasswordValidator
的哪些实现被注入 UserManager
。您的问题似乎与简单的数据查找有关,因此这也是一个单独的问题。
使用
userManager.FindByUsernameAsync()
比直接从数据库获取用户有什么优势?使用 UserManager 更安全吗? var user = await UserManager.FindByNameAsync(userName);
UserManager
是一种抽象数据层的方法。通过在容器级别设置身份,您允许 UserManager
针对 IUserStore
.
例如,您可以看到 UserStore
最终会执行一些额外的任务(如加载声明、登录和角色)。它还匹配上层(因此可以使用规范化名称)和当前文化 - 您希望通过直接数据库查找处理自己的详细信息。
此外,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 提供 UserManager
和 RoleManager
作为数据访问的有用抽象,可以方便地执行许多有用的任务(完全避免注入数据库)。此外,如果您发现自己需要执行这些管理器未提供的某些 user/role 相关功能,则可能是反模式的标志。
更新:
关于安全性:UserManager
安全性取决于您在容器中设置的数据库连接。换句话说,你在加密你的连接字符串吗?您与数据库的通信是否通过安全连接?无论您是在 UserManager
中抽象您的数据库连接还是直接注入您的数据库上下文,所有典型的数据库安全问题都将保持不变。但我认为安全的数据库访问完全是另一个问题。
UserManager
中有一些方法,您肯定希望将其用于安全隐患 - 特别是密码 creation/management(CheckPasswordAsync
、AddPasswordAsync
等) .但这些最终取决于 IPasswordHasher
和 IPasswordValidator
的哪些实现被注入 UserManager
。您的问题似乎与简单的数据查找有关,因此这也是一个单独的问题。