【发布时间】:2020-03-28 12:24:06
【问题描述】:
与直接从 DB 获取用户相比,使用
userManager.FindByUsernameAsync()有什么优势?使用 UserManager 是否更安全? var user = await UserManager.FindByNameAsync(userName);
【问题讨论】:
标签: c# asp.net-core asp.net-identity
与直接从 DB 获取用户相比,使用 userManager.FindByUsernameAsync() 有什么优势?
使用 UserManager 是否更安全? var user = await UserManager.FindByNameAsync(userName);
【问题讨论】:
标签: c# asp.net-core asp.net-identity
UserManager 是一种抽象数据层的方法。通过在容器级别设置身份,您允许UserManager 对IUserStore 进行操作。
例如,您可以看到UserStore 最终会执行一些额外的任务(例如加载声明、登录名和角色)。它还匹配上层(因此可以使用规范化名称)和当前文化 - 您希望通过直接 DB 查找自己处理的详细信息。
此外,UserManager 可能更易于测试,因为您不必担心将InMemory 用于实体框架:
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 作为数据访问的有用抽象,可以方便地执行许多有用的任务(完全避免注入数据库的需要)。此外,如果您发现自己需要执行这些管理器未提供的某些与用户/角色相关的功能,则可能是反模式的标志。
更新:
关于安全性:UserManager 的安全性取决于您在容器中设置的数据库连接。换句话说,您是否在加密您的连接字符串?您与数据库的通信是否通过安全连接进行?无论您是在UserManager 中抽象您的数据库连接还是直接注入您的数据库上下文,所有典型的数据库安全问题都将保持不变。但我认为安全的数据库访问完全是另一个问题。
UserManager 内部有一些方法,您肯定会希望使用这些方法来解决它们的安全隐患——特别是围绕密码创建/管理(CheckPasswordAsync、AddPasswordAsync 等)。但这些最终取决于IPasswordHasher 和IPasswordValidator 的哪些实现被注入UserManager。您的问题似乎与简单的数据查找有关,因此这也是一个单独的问题。
【讨论】: