引入IdentityServer4后如何处理现有应用程序中的现有用户表

What to do with existing user tables in existing applications after introducing IdentityServer4

我们有几个现有的应用程序,每个应用程序都有自己的数据库(和自己的用户 table,因为不同的应用程序有不同的客户)。每个应用程序都有自己的 login/change password/reset password/forget 密码等。现在我们想用 IdentityServer4 构建一个中央 authentication/authorization 服务器,现有的应用程序和未来的新应用程序都可以使用并且没有不再需要做函数谎言 login/change password/reset password/forget 一次又一次地为每个应用程序设置密码。

所以我的问题是我们应该如何处理这些现有用户 table?我可以看到两个选项:

  1. 保留现有用户 tables 当客户尝试登录应用程序时,他将被重定向到身份服务器,它会查找现有用户 table。当不同应用的不同客户到来时,它会查找不同的现有用户 table.

  2. 将所有现有用户 table 合并到身份服务器新数据库中的单个用户 table,并删除所有现有用户 table . 但在那些应用程序中,用户登录后,程序可能仍需要访问这些用户 table。如果我们合并到身份服务器中的新table,我们如何解决这个问题?我们不能在身份服务器中直接访问该用户 table ,对吗?

我觉得选项 2 是正确的方法,但不确切知道原因和方法。谁能给我解释一下?谢谢。

这是我的建议:

  1. 创建新用户Table
  2. 为旧应用用户创建新用户Table
  3. 填充新用户table

创建新用户Table

使用您的个人应用程序用户 table 的所有公共字段创建一个新用户 table。像这个例子。

CREATE TABLE [USERS](
    [ID]  [bigint] IDENTITY(1,1)  NOT NULL
    [FIRST_NAME] [char](15) NOT NULL,
    [LAST_NAME] [char](30) NOT NULL,    
    [PASSWORD] [char](15) NOT NULL,
    [PHONE] [char](12) NOT NULL,
    [PHONE_EXT] [char](4) NOT NULL,
    [EMAIL] [char](50) NOT NULL,
    [STATUS] [char](1) NOT NULL,    
    [UPD_TSTAMP] [datetime] NOT NULL,
    [UPD_USER] [char](8) NOT NULL
)

如果您的应用程序具有并非所有应用程序都通用的其他字段,您可以编写代码以在相应的应用程序中查找这些详细信息。您不想将其包含在常见的 table.

为老应用用户创建新用户Table

此 table 将允许您继续在您的应用程序中使用可能与旧用户 ID 相关联的任何特殊逻辑。

这允许您做的第二件事是在迁移过程中跟踪新用户 ID 到旧用户 ID 的映射。

警告 - 您应该确保您现有的用户 ID 属于同一类型。此示例将假设它们都是 bigint 类型。

UserID 是第一个 table 中 Users.ID 列的外键。

CREATE TABLE [USER_APPS](
    UserID [bigint] NOT NULL,
    AppName  [char](30) NOT NULL,
    AppUserID [bigint] NOT NULL
)

填充新用户Table

当用户尝试登录时,首先搜索新的 table。如果没有记录,则搜索每个应用程序的用户 table 以查看是否找到匹配项。如果没有匹配提示用户遵循您的注册过程。如果找到匹配项,请在 USERSUSER_APPS table 中创建一条新记录。向用户显示辅助屏幕并询问用户是否使用不同的用户 ID 和密码组合使用您的其他应用程序之一。如果他们确实有其他帐户,请尝试对他们进行身份验证。如果他们成功,则在 USER_APPS table 中输入相应的记录。您将继续这个流程,直到用户没有更多的应用程序可以登录。完成后,要求他们更新密码。 作为更新密码逻辑的一部分,您可能想要更新您在 USER_APPS table.

中映射的所有应用程序密码

按照我在 上的说明,了解如何让 IdentityServer4 使用现有数据库对用户进行身份验证。