在生产数据库中填充初始角色

Populating initial roles in a production database

首次将应用程序部署到生产环境时(例如,使用 Asp.Net Identity 进行用户管理,Entity Framework Core 进行 ORM)并且需要初始管理员帐户在部署后创建,安全实现此目的的最佳方法是什么?我能想到的以下所有选项都不完美:

  1. 如果迁移的数据库还没有角色/用户,则使用 DbSeed class 在启动时为管理员角色和用户设置种子(这有角色名称和用户密码都被删除的缺点在应用程序本身中硬编码
  2. 运行 一个从 entity framework 迁移生成 SQL 的脚本,修改脚本以播种管理员用户,然后将脚本应用于生产数据库(生成的 SQL 脚本中现在再次存在用户密码)
  3. 在生产环境中访问数据库,并手动将用户和角色添加到 AspNetUsers 和 AspNetRoles table 手动(但是对于此选项,我不知道有什么方法可以插入正确的散列+加盐密码,而不在开发数据库中创建一些已知密码并将其复制到生产中,但这看起来很笨重)

有没有我可能错过的标准方法?

模式将取决于您的用例,以及您期望应用程序的部署方式。您需要考虑设置环境的风险状况。

一般来说,硬编码值不是一个好主意,尤其是对于任何面向网络的东西。自动“无用户”检测作为触发器也存在一些问题 - 因为它会将所有现有用户删除到攻击向量中。

常见型号包括:

  • 如果使用 SSO、联合身份验证或类似方式,请尽可能依赖身份验证平台机制来处理此问题。

  • 安装程序设置 - 安装/部署过程的某些部分允许设置初始凭据。

  • "first 运行" - 首次访问应用程序/网站时,某种设置过程 运行s,允许您配置第一个用户和任何其他用户初始设置。

  • 日志令牌 - 应用程序生成某种临时凭证并在首次启动时记录它 - 这允许任何具有日志访问权限的人使用它登录。可用于构建“第一个 运行”的安全性。

  • 在配置中启用临时用户- 在静态配置文件中定义用户凭据,用于设置,然后删除。

在使用临时凭据的任何情况下,都应尽可能减少 - 即。一次性使用,限时,最小权限。