private void SaveClientsWithChildren(CustomConfigurationDbContext ctx, ClientDataStorage storage) { // Clients SaveWithIdentityColumn(ctx, nameof(ctx.Clients)); // ClientClaims ctx.ClientClaims.AddRange(storage.Claims); SaveWithIdentityColumn(ctx, nameof(ctx.ClientClaims)); // ClientRedirectUris ctx.ClientRedirectUris.AddRange(storage.RedirectUris); SaveWithIdentityColumn(ctx, nameof(ctx.ClientRedirectUris)); // PostLogoutRedirectUris ctx.ClientPostLogoutRedirectUris.AddRange(storage.PostLogoutRedirectUris); SaveWithIdentityColumn(ctx, nameof(ctx.ClientPostLogoutRedirectUris)); // ClientCorsOrigins ctx.ClientCorsOrigins.AddRange(storage.AllowedCorsOrigins); SaveWithIdentityColumn(ctx, nameof(ctx.ClientCorsOrigins)); // ClientScopes ctx.ClientScopes.AddRange(storage.AllowedScopes); SaveWithIdentityColumn(ctx, nameof(ctx.ClientScopes)); // AllowedGrantTypes ctx.ClientGrantTypes.AddRange(storage.AllowedGrantTypes); SaveWithIdentityColumn(ctx, nameof(ctx.ClientGrantTypes)); // ClientSecrets ctx.ClientSecrets.AddRange(storage.ClientSecrets); SaveWithIdentityColumn(ctx, nameof(ctx.ClientSecrets)); // Properties ctx.ClientProperties.AddRange(storage.Properties); SaveWithIdentityColumn(ctx, nameof(ctx.ClientProperties)); // IdentityProviderRestrictions ctx.ClientIdPRestrictions.AddRange(storage.IdentityProviderRestrictions); SaveWithIdentityColumn(ctx, nameof(ctx.ClientIdPRestrictions)); }
/// Making Ids4 entities tree from Ids3 and Copy to Ids4 Database public (Ids3RootDTO, Ids4RootDTO) CopyClientsScopesTreeFromIds3DbToIds4Db(bool enableScopeToApiResource2ndLevelMapping) { var existingTargetClients4 = Ids4Tool.GetIds4ClientsRoot(); var existingClients4Ids = existingTargetClients4.Clients.Select(x => x.ClientId).ToList(); // Source var clients3Source = Ids3Tool.GetIds3ClientsRoot(); var clients = _mapper.Map <Ids4Entities.Client[]>(clients3Source.Clients); var storage = new ClientDataStorage(clients.ToList(), existingClients4Ids); using (CustomConfigurationDbContext ctx = new CustomConfigurationDbContextFactory(_configuration).CreateDbContext(Array.Empty <string>())) { DatabaseHelper.SwitchIdentityInsertState(ctx, "OFF"); // Clients foreach (var c in storage.Clients) { // Add to DbContext ctx.Clients.Add(c); } storage.Filter(existingClients4Ids);// optional double check, just for sure SaveClientsWithChildren(ctx, storage); // IdentityResources var identityResources4Target = _mapper.Map <Ids4Entities.IdentityResource[]>(clients3Source.Scopes.Where(x => x.Type == (int)ScopeType.Identity)); // ApiResources var apiResources4Target = _mapper.Map <Ids4Entities.ApiResource[]>(clients3Source.Scopes.Where(x => x.Type == (int)ScopeType.Resource)); // TODO: think about 2nd level claims and rework properly // because 2nd level api scope includes into aud claim if (enableScopeToApiResource2ndLevelMapping) { var apiScopes = _mapper.Map <Ids4Entities.ApiScope[]>( clients3Source.Scopes.Where(x => x.Type == (int)ScopeType.Resource)); // Transform children Level#1 and Level#2 for (int i = 0; i < apiResources4Target.Length; i++) { var ar = apiResources4Target[i]; apiScopes[i].ApiResource = ar; // 1 ApiResource => 1 ApiScope ar.Scopes.Add(apiScopes[i]); for (int j = 0; j < apiScopes[i].UserClaims.Count; j++) { apiScopes[i].UserClaims[j].ApiScope = apiScopes[i]; apiScopes[i].UserClaims[j].ApiScopeId = apiScopes[i].Id; } } } var existingApiResNames = existingTargetClients4.ApiResources.Select(x => x.Name).ToList(); var existingIdentityResNames = existingTargetClients4.IdentityResources.Select(x => x.Name).ToList(); var resourcesStorage = new ResourcesDataStorage( identityResources4Target, apiResources4Target, existingIdentityResNames, existingApiResNames); SaveResources(ctx, resourcesStorage); DatabaseHelper.SwitchIdentityInsertState(ctx, "OFF"); return(clients3Source, new Ids4RootDTO { Clients = clients, IdentityResources = identityResources4Target, ApiResources = apiResources4Target }); } }