-- iCONAbpFX 的闭环补丁:库从 staging 拷来后执行一次(loop.ps1 reset-abp -Init),之后 BACKUP 到实例默认备份目录留底。 -- -- 签名密钥不在库里:ABP 用 AddDeveloperSigningCredential,从宿主目录的 tempkey.jwk 读, -- 没有就生成。loop.ps1 deploy 会删掉发布目录里的 tempkey.*,让本机生成一把只在 run\abp 里的新密钥, -- 所以闭环签出的 token 在 staging / 生产都验不过。(方案 v4 §2.1 以为密钥入库,实际不是。) -- -- 这里只换三样凭据,让闭环不必知道 staging 的明文: -- setsail 的 client secret → loop-setsail-secret -- FX_App 的 client secret → loop-fxapp-secret -- admin 的密码(iXserver 用 FX_App + password 授权取模板)→ Loop@123456 -- 明文都在 config\loop.psd1 里,是闭环专用的假值。 SET NOCOUNT ON; SET XACT_ABORT ON; BEGIN TRANSACTION; ------------------------------------------------------------------------------------------------ -- 1. setsail 的 secret:IdentityServer4 存的是 Base64(SHA256(UTF8(secret))) ------------------------------------------------------------------------------------------------ DECLARE @setsail UNIQUEIDENTIFIER = (SELECT Id FROM dbo.IdentityServerClients WHERE ClientId = N'setsail'); IF @setsail IS NULL THROW 50001, N'iCONAbpFX 里没有 setsail client,库是不是从 staging 拷的?', 1; DELETE FROM dbo.IdentityServerClientSecrets WHERE ClientId = @setsail; INSERT INTO dbo.IdentityServerClientSecrets (ClientId, Type, Value, Description, Expiration) VALUES (@setsail, N'SharedSecret', N'ooFrp78vixE5Hq+OfnE3FXBedZPUiT8mjNzICr2EB80=', N'loop env', NULL); -- FX_App 同理 DECLARE @fxapp UNIQUEIDENTIFIER = (SELECT Id FROM dbo.IdentityServerClients WHERE ClientId = N'FX_App'); IF @fxapp IS NULL THROW 50003, N'iCONAbpFX 里没有 FX_App client', 1; DELETE FROM dbo.IdentityServerClientSecrets WHERE ClientId = @fxapp; INSERT INTO dbo.IdentityServerClientSecrets (ClientId, Type, Value, Description, Expiration) VALUES (@fxapp, N'SharedSecret', N'4wsAVCVjGIuA3sm8w1VV1yvrlD9+nrONjlWXabX6cJw=', N'loop env', NULL); ------------------------------------------------------------------------------------------------ -- 2. admin 的密码:ASP.NET Core Identity V3 格式(HMACSHA256,10000 次,16 字节盐) -- 盐是固定的 'loop-env-salt-01',补丁可重复执行、结果不变 ------------------------------------------------------------------------------------------------ IF NOT EXISTS (SELECT 1 FROM dbo.AbpUsers WHERE UserName = N'admin' AND TenantId IS NULL) THROW 50002, N'iCONAbpFX 里没有 host 的 admin 用户', 1; UPDATE dbo.AbpUsers SET PasswordHash = N'AQAAAAEAACcQAAAAEGxvb3AtZW52LXNhbHQtMDHzcKLvk4EOtgWerM+7p4SzG/uo/xPnsQw7mAP1Jo6Gvw==', SecurityStamp = CONVERT(NVARCHAR(36), NEWID()), AccessFailedCount = 0, LockoutEnd = NULL WHERE UserName = N'admin' AND TenantId IS NULL; COMMIT TRANSACTION; SELECT c.ClientId, c.Enabled, c.AccessTokenLifetime, (SELECT COUNT(*) FROM dbo.IdentityServerClientSecrets s WHERE s.ClientId = c.Id) AS secrets FROM dbo.IdentityServerClients c WHERE c.ClientId IN (N'setsail', N'FX_App');