更新IdentityServer4的客户端数据库

更新IdentityServer4的客户端数据库,identityserver4,Identityserver4,我在我的网络核心应用程序中将服务器4标识为我的oAuth服务器。我能够使用以下代码初始化客户端数据库: public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); using (var servi

我在我的网络核心应用程序中将服务器4标识为我的oAuth服务器。我能够使用以下代码初始化客户端数据库:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
            {
                SeedData.EnsureSeedData(serviceScope);
            }
        } 
    }
public void配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
使用(var serviceScope=app.ApplicationServices.GetRequiredService().CreateScope())
{
SeedData.EnsuresedData(服务范围);
}
} 
}
迁移和客户端初始化是使用

  public class SeedData
{
    public static void EnsureSeedData(IServiceScope serviceScope)
    {
        Console.WriteLine("Seeding database...");

           serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();

            var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
            context.Database.Migrate();

            EnsureSeedData(context);

        Console.WriteLine("Done seeding database.");
        Console.WriteLine();
    }

    private static void EnsureSeedData(ConfigurationDbContext context)
    {
        if (!context.Clients.Any())
        {
            Console.WriteLine("Clients being populated");
            foreach (var client in Config.GetClients().ToList())
            {
                context.Clients.Add(client.ToEntity());
            }
            context.SaveChanges();
        }
        else
        {
           Console.WriteLine("Clients already populated, update clients");
                foreach (var client in Config.GetClients().ToList())
                {
                    var item = context.Clients.Where(c => c.ClientId == client.ClientId).FirstOrDefault();
                   if(item == null)
                    {
                        context.Clients.Add(client.ToEntity());
                    } else {
                        var model = client.ToEntity();
                        model.Id = item.Id;
                        context.Entry(item).CurrentValues.SetValues(model);
                    }                       
                }
                context.SaveChanges();
            }

            if (!context.IdentityResources.Any())
        {
            Console.WriteLine("IdentityResources being populated");
            foreach (var resource in Config.GetIdentityResources().ToList())
            {
                context.IdentityResources.Add(resource.ToEntity());
            }
            context.SaveChanges();
        }
        else
        {
           Console.WriteLine("IdentityResources already populated");
                foreach (var resource in Config.GetIdentityResources().ToList())
                {
                    var item = context.IdentityResources.Where(c => c.Name == resource.Name).FirstOrDefault();
                    if (item == null)
                    {
                        context.IdentityResources.Add(resource.ToEntity());
                    }
                    else
                    {
                        var model = resource.ToEntity();
                        model.Id = item.Id;
                        context.Entry(item).CurrentValues.SetValues(model);
                    }
                }
                context.SaveChanges();
            }

            if (!context.ApiResources.Any())
        {
            Console.WriteLine("ApiResources being populated");
            foreach (var resource in Config.GetApiResources().ToList())
            {
                context.ApiResources.Add(resource.ToEntity());
            }
            context.SaveChanges();
        }
        else
        {
           Console.WriteLine("ApiResources already populated");
                foreach (var resource in Config.GetApiResources().ToList())
                {
                    var item = context.ApiResources.Where(c => c.Name == resource.Name).FirstOrDefault();
                    if (item == null)
                    {
                        context.ApiResources.Add(resource.ToEntity());
                    }
                    else
                    {
                    var model = resource.ToEntity();
                    model.Id = item.Id;
                    context.Entry(item).CurrentValues.SetValues(model);
                    }
                }
               context.SaveChanges();
            }
    }
}
公共类种子数据
{
公共静态无效数据(IServiceScope服务范围)
{
控制台.WriteLine(“种子数据库…”);
serviceScope.ServiceProvider.GetRequiredService().Database.Migrate();
var context=serviceScope.ServiceProvider.GetRequiredService();
Migrate();
保证数据(上下文);
WriteLine(“完成种子设定数据库”);
Console.WriteLine();
}
私有静态数据(ConfigurationDbContext上下文)
{
如果(!context.Clients.Any())
{
Console.WriteLine(“正在填充的客户端”);
foreach(Config.GetClients().ToList()中的var client)
{
context.Clients.Add(client.ToEntity());
}
SaveChanges();
}
其他的
{
Console.WriteLine(“已填充客户端,更新客户端”);
foreach(Config.GetClients().ToList()中的var client)
{
var item=context.Clients.Where(c=>c.ClientId==client.ClientId.FirstOrDefault();
如果(项==null)
{
context.Clients.Add(client.ToEntity());
}否则{
var model=client.ToEntity();
model.Id=item.Id;
context.Entry(item).CurrentValues.SetValues(model);
}                       
}
SaveChanges();
}
如果(!context.IdentityResources.Any())
{
Console.WriteLine(“正在填充的标识资源”);
foreach(Config.GetIdentityResources().ToList()中的var资源)
{
Add(resource.ToEntity());
}
SaveChanges();
}
其他的
{
Console.WriteLine(“已填充标识资源”);
foreach(Config.GetIdentityResources().ToList()中的var资源)
{
var item=context.IdentityResources.Where(c=>c.Name==resource.Name).FirstOrDefault();
如果(项==null)
{
Add(resource.ToEntity());
}
其他的
{
var model=resource.ToEntity();
model.Id=item.Id;
context.Entry(item).CurrentValues.SetValues(model);
}
}
SaveChanges();
}
如果(!context.ApiResources.Any())
{
Console.WriteLine(“正在填充的ApiResources”);
foreach(Config.GetApiResources().ToList()中的var资源)
{
Add(resource.ToEntity());
}
SaveChanges();
}
其他的
{
Console.WriteLine(“已填充ApiResources”);
foreach(Config.GetApiResources().ToList()中的var资源)
{
var item=context.apirources.Where(c=>c.Name==resource.Name).FirstOrDefault();
如果(项==null)
{
Add(resource.ToEntity());
}
其他的
{
var model=resource.ToEntity();
model.Id=item.Id;
context.Entry(item).CurrentValues.SetValues(model);
}
}
SaveChanges();
}
}
}

客户端数据库的初始化工作正常。但是,更新客户端数据库时存在问题。有些记录没有更新。有更好的方法吗?

经过一番努力,我找到了一个适合我的解决方案。基本上,我创建了一个表ClientVersion,用于跟踪客户端定义的更改

这是我的新版本SeedData.cs

   public class SeedData
{
    public static void EnsureSeedData(IServiceScope serviceScope)
    {
        Console.WriteLine("Seeding database...");

        serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();

        var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
        context.Database.Migrate();

        var versionContext = serviceScope.ServiceProvider.GetRequiredService<VersionContext>();
        versionContext.Database.Migrate();

        EnsureSeedData(context, versionContext);

        Console.WriteLine("Done seeding database.");
        Console.WriteLine();
    }

    private static void EnsureSeedData(ConfigurationDbContext context, VersionContext versionContext)
    {
        ClientVersion version = versionContext.ClientVersion.FirstOrDefault();
        bool blUpdate = version == null ? true : (Config.CurrentVersion > version.Version ? true: false);
        if(blUpdate)
        {
            if(version == null)
            {
                version = new ClientVersion()
                {
                    Version = Config.CurrentVersion,
                };
                versionContext.ClientVersion.Add(version);
            } else
            {
                version.Version = Config.CurrentVersion;
                versionContext.ClientVersion.Update(version);
            }
            versionContext.SaveChanges();
        }
        if (!context.Clients.Any())
        {
            Console.WriteLine("Clients being populated");
            foreach (var client in Config.GetClients().ToList())
            {
                context.Clients.Add(client.ToEntity());
            }
            context.SaveChanges();
        }
        else
        {
            Console.WriteLine("Clients already populated, update clients");
            if (blUpdate)
            {
                foreach (var client in Config.GetClients().ToList())
                {
                    var item = context.Clients
                        .Include(x => x.RedirectUris)
                        .Include(x => x.PostLogoutRedirectUris)
                        .Include(x => x.ClientSecrets)
                        .Include(x => x.Claims)
                        .Include(x => x.AllowedScopes)
                        .Include(x => x.AllowedCorsOrigins)
                        .Include(x => x.AllowedGrantTypes)
                        .Where(c => c.ClientId == client.ClientId).FirstOrDefault();
                    if (item != null)
                    {
                        context.Clients.Remove(item);
                    }
                    context.Clients.Add(client.ToEntity());
                }
                context.SaveChanges();
            }
        }

        if (!context.IdentityResources.Any())
        {
            Console.WriteLine("IdentityResources being populated");
            foreach (var resource in Config.GetIdentityResources().ToList())
            {
                context.IdentityResources.Add(resource.ToEntity());
            }
            context.SaveChanges();
        }
        else
        {
            Console.WriteLine("IdentityResources already populated");
            if (blUpdate)
            {
                foreach (var resource in Config.GetIdentityResources().ToList())
                {
                    var item = context.IdentityResources.Where(c => c.Name == resource.Name).FirstOrDefault();
                    if (item != null)
                    {
                        context.IdentityResources.Remove(item);
                    }
                    context.IdentityResources.Add(resource.ToEntity());
                }
                context.SaveChanges();
            }
        }

        if (!context.ApiResources.Any())
        {
            Console.WriteLine("ApiResources being populated");
            foreach (var resource in Config.GetApiResources().ToList())
            {
                context.ApiResources.Add(resource.ToEntity());
            }
            context.SaveChanges();
        }
        else
        {
            Console.WriteLine("ApiResources already populated");
            if (blUpdate)
            {
                foreach (var resource in Config.GetApiResources().ToList())
                {
                    var item = context.ApiResources.Where(c => c.Name == resource.Name).FirstOrDefault();
                    if (item != null)
                    {
                        context.ApiResources.Remove(item);
                    }
                    context.ApiResources.Add(resource.ToEntity());
                }
                context.SaveChanges();
            }
        }
    }
}
公共类种子数据
{
公共静态无效数据(IServiceScope服务范围)
{
控制台.WriteLine(“种子数据库…”);
serviceScope.ServiceProvider.GetRequiredService().Database.Migrate();
var context=serviceScope.ServiceProvider.GetRequiredService();
Migrate();
var versionContext=serviceScope.ServiceProvider.GetRequiredService();
versionContext.Database.Migrate();
确保数据(上下文、版本上下文);
WriteLine(“完成种子设定数据库”);
Console.WriteLine();
}
私有静态数据(ConfigurationDbContext上下文,VersionContext VersionContext)
{
ClientVersion version=versionContext.ClientVersion.FirstOrDefault();
bool blUpdate=version==null?真:(Config.CurrentVersion>version.version?真:假);
如果(blUpdate)
{
如果(版本==null)
{
版本=新客户端版本()
{
Version=Config.CurrentVersion,
};
versionContext.ClientVersion.Add(版本);
}埃尔