예제 #1
0
        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));
        }
예제 #2
0
        /// 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
                });
            }
        }