对于带有.InMemoryResources / Cients的PersistedGrants,可以使用.AddOperationalStore吗?

时间:2017-03-24 14:31:29

标签: identityserver4

我想将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。错误:无法执行   对空引用的运行时绑定

1 个答案:

答案 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>();

通过这种方式,我们的IdentityResourcesApiResourcesClients会从配置文件中提取,我们的Grants会使用我们自己的{{1}实现进行管理}。我们没有对该接口做任何特别的事情:它是一个非常直接的接口,只需要一些简单的方法即可实现。