在.Net core和.Net标准身份框架之间共享公共数据库

Bha*_*rat 6 c# identity asp.net-mvc-4 asp.net-core

我有使用Identity 2.0的旧版 MVC 应用程序。最近我还使用Identity 6.0 创建了 .Net 6 API (AspNetCore.Identity.EntityFrameworkCore)。

笔记:这个框架中有一些与模式相关的更改,例如一些附加的表和字段。检查我最后添加的快照。

问题是我必须管理的通用数据库。

  • 我已尝试并成功完成了使用最新架构的现有数据库的更新。
  • 我还迁移了身份表的数据。
  • 我现在面临的唯一问题是我不确定如何进一步支持旧的遗留应用程序。(我希望拥有旧的应用程序,但希望它使用新的身份表。)
  • 由于现有/旧应用程序位于 .Net Framework 4.6.1 中,因此我无法真正更新身份及其表中的最新架构。(我不介意进行任何黑客攻击或任何修复。旧应用程序应该与最新的身份模式一起使用,这对我来说是目前的重点。)

是否有任何选项可以让我在不更改代码的情况下遵循,我的截止日期很紧,而且我真的不想创建外部 API 来验证旧的遗留应用程序。任何帮助或想法将非常感激。

在此输入图像描述

小智 1

我遇到了同样的问题,最终使用架构创建了新的身份核心表。

builder.ToTable(name: "Users", "Identity");
builder.ToTable(name: "Roles", "Identity");
builder.ToTable(name: "UserRoles", "Identity");
builder.ToTable(name: "UserClaims", "Identity");
builder.ToTable(name: "UserLogins", "Identity");
builder.ToTable(name: "UserTokens", "Identity");
builder.ToTable(name: "RoleClaims", "Identity");
Run Code Online (Sandbox Code Playgroud)

然后,我在旧的身份用户表上使用触发器来保持新的身份用户表同步。

CREATE/*ALTER*/ TRIGGER [dbo].[IdentityUsers_Sync] ON [dbo].[Users] 
AFTER INSERT, UPDATE AS 
BEGIN
    --INSERT
    IF NOT EXISTS (SELECT * FROM deleted)
        BEGIN
            INSERT INTO [Identity].[Users] 
            (
                Id,
                UserName,
                NormalizedUserName,
                Email,
                NormalizedEmail,
                EmailConfirmed,
                PasswordHash,
                SecurityStamp,
                PhoneNumber,
                PhoneNumberConfirmed,
                TwoFactorEnabled,
                LockoutEnabled,
                AccessFailedCount
            )
            SELECT
                Id,
                UserName,
                UPPER(UserName),
                Email,
                UPPER(Email),
                EmailConfirmed,
                PasswordHash,
                SecurityStamp,
                PhoneNumber,
                PhoneNumberConfirmed,
                TwoFactorEnabled,
                0,
                0
            FROM inserted
        END
    --UPDATE
    IF EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)
        BEGIN
            UPDATE iu
            SET 
                iu.UserName = i.UserName,
                iu.NormalizedUserName = UPPER(i.UserName),
                iu.Email = i.Email,
                iu.NormalizedEmail = UPPER(i.Email),
                iu.EmailConfirmed = i.EmailConfirmed,
                iu.PasswordHash = i.PasswordHash,
                iu.SecurityStamp = i.SecurityStamp,
                iu.PhoneNumber = i.PhoneNumber,
                iu.PhoneNumberConfirmed = i.PhoneNumberConfirmed,
                iu.TwoFactorEnabled = i.TwoFactorEnabled,
                iu.LockoutEnabled = 0,
                iu.AccessFailedCount = 0
            FROM [Identity].[Users] iu, inserted i
            WHERE iu.Id = i.Id
        END
END
GO
ALTER TABLE [dbo].[Users] ENABLE TRIGGER [IdentityUsers_Sync]
GO

Run Code Online (Sandbox Code Playgroud)

我的计划是在遗留系统中创建一个 api 控制器来处理新的注册(通过任何新的核心应用程序中的 HttpClient)。然后触发器将拾取它并使新系统保持同步。

让遗留系统使用新的身份表目前看来不是一个选择。也许可以将其他字段添加到新架构中并使用触发器来填充它们?没试过。