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