【问题标题】:Is it bad practice to Fetch AspNet User directly from DB vs UserManager?直接从 DB 和 UserManager 获取 AspNet 用户是不好的做法吗?
【发布时间】:2020-03-28 12:24:06
【问题描述】:
  1. 与直接从 DB 获取用户相比,使用 userManager.FindByUsernameAsync() 有什么优势?

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

【问题讨论】:

    标签: c# asp.net-core asp.net-identity


    【解决方案1】:

    UserManager 是一种抽象数据层的方法。通过在容器级别设置身份,您允许UserManagerIUserStore 进行操作。

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

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

    此外,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 提供了UserManagerRoleManager 作为数据访问的有用抽象,可以方便地执行许多有用的任务(完全避免注入数据库的需要)。此外,如果您发现自己需要执行这些管理器未提供的某些与用户/角色相关的功能,则可能是反模式的标志。

    更新:

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

    UserManager 内部有一些方法,您肯定会希望使用这些方法来解决它们的安全隐患——特别是围绕密码创建/管理(CheckPasswordAsyncAddPasswordAsync 等)。但这些最终取决于IPasswordHasherIPasswordValidator 的哪些实现被注入UserManager。您的问题似乎与简单的数据查找有关,因此这也是一个单独的问题。

    【讨论】:

    • 谢谢。跟进QQ。 2.使用UserManager是不是更安全?
    猜你喜欢
    • 2014-06-13
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2011-09-26
    • 1970-01-01
    • 2017-12-28
    • 2014-04-30
    相关资源
    最近更新 更多