身份服务器负载平衡失败。启动身份服务器的多个实例时不起作用。对于单个Identity Server实例,它按预期运行正常。是因为我的IdentityServer4实现不能持久保存刷新令牌吗?
最初,我的身份服务器将所有内容存储在内存中。现在,在身份服务器负载平衡失败后,尝试实现IPersistantGrantStore并添加AddOperationalStore,它创建了DB,但是没有存储任何内容.Startup.cs在下面。如果有什么问题。
public void ConfigureServices(IServiceCollection services)
{
ApplicationSettings applicationSettings = Configuration
.GetSection("ApplicationSettings")
.Get<ApplicationSettings>();
DatabaseSettings dbSettings = Configuration
.GetSection("DatabaseSettings")
.Get<DatabaseSettings>() ?? new DatabaseSettings();
LoggingSettings loggingSettings = Configuration
.GetSection("LoggingSettings")
.Get<LoggingSettings>();
var migrationsAssembly = this.GetType().Assembly.GetName().Name;
services.AddMvc();
services.InitialiseDbContext<PersistedGrantDbContext>(dbSettings);
var appSettingsSection = Configuration.GetSection("ApplicationSettings");
var appSettings = appSettingsSection.Get<ApplicationSettings>();
services.Configure<ApplicationSettings>(appSettingsSection);
.
services.AddCors(options =>
{
options.AddPolicy("AllowAllOriginsHeadersAndMethods",
builder => builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
});
var identityServerBuilder = services
.AddIdentityServer(iso =>
{
if (String.IsNullOrEmpty(applicationSettings.PublicOriginUri) == false)
iso.PublicOrigin = applicationSettings.PublicOriginUri;
if (String.IsNullOrEmpty(applicationSettings.IssuerUri) == false)
iso.IssuerUri = applicationSettings.IssuerUri;
if (String.IsNullOrEmpty(applicationSettings.LoginUrl) == false)
iso.UserInteraction.LoginUrl = applicationSettings.LoginUrl;
});
if (CurrentEnvironment.IsDevelopment())
{
identityServerBuilder.AddDeveloperSigningCredential();
}
else
{
identityServerBuilder.AddSigningCredential(new CertificateManager().GetCertificate(applicationSettings.CertificateKey, applicationSettings.CertificatePrivateKey,
applicationSettings.CertificatePassword, string.Empty, string.Empty, applicationSettings.AWSEndPointRegion));
}
// this adds the operational data from DB (codes, tokens, consents)
identityServerBuilder.AddOperationalStore(options =>
{
options.ConfigureDbContext = builder =>
builder.UseNpgsql(dbSettings.ConnectionString,
sql => sql.MigrationsAssembly(migrationsAssembly));
// this enables automatic token cleanup. this is optional.
options.EnableTokenCleanup = true;
options.TokenCleanupInterval = 10; // interval in seconds, short for testing
});
services.AddSingleton<IUserFacade, UserFacade>();
services.AddTransient<IProfileService, ProfileService>();
// Setup dependency injection (TODO: Replace the 'InMemoryXxxxx' services with real ones):
services.AddScoped<IConfigurationFacade, InMemoryConfigurationFacade>();
services.AddSingleton<IClientStore, JsonFileClientStore>();
services.AddSingleton<IResourceStore, ResourcesStore>();
services.AddScoped<IHttpContextFacade, HttpContextFacade>();
services.AddScoped<IUserContextFacade, UserContextFacade>();
services.AddSingleton<IRestHelper, RestHelper>();
services.AddTransient<IPersistedGrantStore, PersistedGrantStore>();
services.AddHttpClient();
ServiceProvider serviceProvider = services.BuildServiceProvider();
IConfigurationFacade config = serviceProvider.GetService<IConfigurationFacade>();
services
.AddAuthentication(IdentityServerCookieName)
.AddCookie(IdentityServerCookieName, options =>
{
options.ExpireTimeSpan = config.UserCookieInactiveLife();
});
}
private void InitializeDatabase(IApplicationBuilder app)
{
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
//TODO-uncomment the below while enabling identityServerBuilder.AddConfigurationStore
//var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
//context.Database.Migrate();
}
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
InitializeDatabase(app);
app.UseCors("AllowAllOriginsHeadersAndMethods");
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseIdentityServer();
app.UseStaticFiles();
app.UseMvcWithDefaultRoute();
}
Identity Server负载平衡故障需要解决