我想将PersistedGrants存储在数据库中以用于Azure Scale Out。
我更喜欢从appsettings.json而不是数据库中读取IdentityResources / ApiResources / Clients(Config)。
从How To on IdentityServer4's doc site开始,示例显示两者都保存到数据库。
存储Grants时是否可以不将配置数据加载到数据库中?如果是这样的话?
这有效:
services.AddIdentityServer((options) =>
{
options.UserInteraction = new UserInteractionOptions
{
LoginUrl = "/login",
LogoutUrl = "/api/Account/Logout",
ErrorUrl = "/error"
};
})
.AddSigningCredential(X509CertificateHelper.getCert(_env))
.AddOperationalStore(builder => builder.UseSqlServer(connectionString,
options => options.MigrationsAssembly(migrationsAssembly)))
.AddConfigurationStore(builder => builder.UseSqlServer(connectionString,
options => options.MigrationsAssembly(migrationsAssembly)))
.AddAspNetIdentity<ApplicationUser>();
这不是。具体来说,我无法运行dotnet ef database update -c PersistedGrantDbContext
。
services.AddIdentityServer((options) =>
{
options.UserInteraction = new UserInteractionOptions
{
LoginUrl = "/login",
LogoutUrl = "/api/Account/Logout",
ErrorUrl = "/error"
};
})
.AddSigningCredential(X509CertificateHelper.getCert(_env))
.AddOperationalStore(builder => builder.UseSqlServer(connectionString,
options => options.MigrationsAssembly(migrationsAssembly)))
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients(AppSettingsHelper.GetIdSrvrSettings()))
.AddAspNetIdentity<ApplicationUser>();
对于后者,我收到以下错误:
启动时调用方法'ConfigureServices'时发生错误 class'Startup'。考虑使用IDbContextFactory来覆盖 在设计时初始化DbContext。错误:无法执行 对空引用的运行时绑定
答案 0 :(得分:3)
&#34;是否可以不将配置数据加载到数据库中 存储Grants?如果是这样的话?&#34;
是的。您为持久性使用EntityFrame工作,因此我提供的信息可能不完全兼容......我们使用其他东西来管理数据库持久性。
我们的ConfigureServices
看起来像这样:
services.AddIdentityServer(x =>
{
x.IssuerUri = webServerSettings.Host;
})
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddInMemoryIdentityResources(Config.GetIdentityResources());
services.AddTransient<IPersistedGrantStore, PersistedGrantStore>();
通过这种方式,我们的IdentityResources
,ApiResources
和Clients
会从配置文件中提取,我们的Grants
会使用我们自己的{{1}实现进行管理}。我们没有对该接口做任何特别的事情:它是一个非常直接的接口,只需要一些简单的方法即可实现。