Как использовать пользовательский API-ресурс, определенный в базе данных вместо InMemoryResource - PullRequest
0 голосов
/ 10 февраля 2019

Мы используем идентификационный сервер 4 с ядром .net 2.1.Наш сервер авторизации работает нормально с ресурсами памяти. Я использовал IResourcesStore для использования пользовательских ресурсов, но я столкнулся с проблемой, когда при вызове сервера авторизации для выдачи токена доступа каждый метод IReourcesStore вызывался дважды.

Мой запускнаходится здесь:

  private void ConfigureOpenId(IServiceCollection services)
    {
        services.AddIdentityServer(action => 
        {
            action.Caching = new CachingOptions
            {
                ResourceStoreExpiration = TimeSpan.FromSeconds(10)
            };
        }).AddSigningCredential(CertificateUtil.Load(AppEnvironment.MapToPhysicalFilePath(Configuration["Saml2:SigningCertificateFile"]), Configuration["Saml2:CertificatePassword"]))
        .AddResourceStore<ResourceStore>()
       .AddSecretValidator<CustomSecretValidator>()
       .AddClientStore<CustomClientStore>()
       .AddCustomTokenRequestValidator<CustomClientClaimsAdder>()         
       .AddInMemoryIdentityResources(OpenIdConfig.GetIdentityResources()).AddResourceStore<ResourceStore>();

        // AddCustomTokenRequestValidator<CustomAuthenticationRequestValidator>().AddCustomAuthorizeRequestValidator<CustomAuthorizeRequestValidator>()
    }

И реализация IResourceStore выглядит следующим образом:

  public class ResourceStore : IResourceStore
{
    public ResourceStore()
    {
    }

    public Task<ApiResource> FindApiResourceAsync(string name)
    {
        var apiresource = new ApiResource();           

        return Task.FromResult(apiresource);
    }

    public Task<IEnumerable<ApiResource>> FindApiResourcesByScopeAsync(IEnumerable<string> scopeNames)
    {
        var apiresource = new ApiResource
        {
            Name = "user",
            Scopes = new List<Scope> { new Scope("users.get") }
        };
        var list = new List<ApiResource>();
        list.Add(apiresource);
        IEnumerable<ApiResource> en = list;
        return Task.FromResult(en);
    }

    public Task<IEnumerable<IdentityResource>> FindIdentityResourcesByScopeAsync(IEnumerable<string> scopeNames)
    {
        var identity = new List<IdentityResource>
        {
            new IdentityResources.OpenId(),
            new IdentityResources.Profile()
        };

        IEnumerable<IdentityResource> en = identity;
        return Task.FromResult(en);
    }

    public Task<Resources> GetAllResourcesAsync()
    {           
        var res = new Resources();          

        return Task.FromResult(res);
    }
}

Здесь в вышеприведенном методе класса 2 и 3 вызывается дважды.

1 Ответ

0 голосов
/ 10 февраля 2019

Итак, если я не ошибаюсь, проблема в том, что кеширование не работает?

Исходя из вашего кода, кажется, что вы наполовину внедрили кеширование для хранилища ресурсов.

IdentityServer.Options.Caching.ResourceStoreExpiration :

Длительность кэша идентификации и конфигурации ресурса API, загруженных из хранилища ресурсов.

Но:

Этот параметр применяется только в том случае, если в конфигурации служб при запуске было включено соответствующее кэширование .

Поэтому добавление кэширования при запуске должен включить его.

.AddInMemoryCaching()

Затем замените эту строку:

.AddResourceStore<ResourceStore>()

на эту строку:

.AddResourceStoreCache<ResourceStore>()

Обновление:

Я не сделалЗаметьте, но вы добавили .AddResourceStore () дважды.Кроме того, вам не нужно AddInMemoryIdentityResources при добавлении собственного хранилища ресурсов.

Таким образом, ваша окончательная настройка может выглядеть следующим образом:

services.AddIdentityServer(action => 
{
    action.Caching = new CachingOptions
    {
        ResourceStoreExpiration = TimeSpan.FromSeconds(10)
    };
})
.AddSigningCredential(CertificateUtil.Load(AppEnvironment.MapToPhysicalFilePath(Configuration["Saml2:SigningCertificateFile"]), Configuration["Saml2:CertificatePassword"]))
.AddSecretValidator<CustomSecretValidator>()
.AddClientStore<CustomClientStore>()
.AddCustomTokenRequestValidator<CustomClientClaimsAdder>()
.AddInMemoryCaching()
.AddResourceStore<ResourceStore>();
...