Масштаб IdentityServer4 по регионам - PullRequest
0 голосов
/ 27 февраля 2019

В настоящее время я использую IDS4 в качестве одного экземпляра в одном регионе (одна база данных для конфигурации и оперативного хранилища).Теперь мне нужно распределить установку по двум регионам, чтобы службы / пользователи в области A получили доступ к IDS в регионе A, а службы / пользователи в регионе B получили доступ к IDS в регионе B.

Оба экземпляра должны получить доступ к одному и тому же хранилищу данных,но IDS в области B не должен выполнять межрегиональные запросы на чтение к базе данных в области A.

Мы используем Azure SQL Server и функцию гео-репликации, которая предлагает один доступный для записи экземпляр (либо в области Aили B) и несколько читаемых экземпляров.Мы указали IDS в регионе B на экземпляр только для чтения в том же регионе, но это не работает, потому что IDS должен записывать рабочие данные, такие как постоянные разрешения.

Есть ли рекомендуемая архитектура для достижения этого или вы?У вас есть опыт внедрения мультирегионального и сбалансированного развертывания IDS?Можно ли настроить IDS для использования другой базы данных для операций записи и базы данных в одном регионе для операций чтения?

Ответы [ 3 ]

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

Вместо гео-репликации вы можете использовать Azure SQL Data Sync, чтобы иметь доступные для записи реплики базы данных SQL Azure, определяя одну из них как базу данных-концентратор, а другую - как базу данных-член.Синхронизация между всеми базами данных может быть настроена двунаправленно, поэтому все базы данных могут быть обновлены.Настроить синхронизацию данных SQL Azure можно в этой документации.

0 голосов
/ 05 марта 2019

Я нахожусь в процессе выкручивания изломов в моей собственной частной вилке IdentityServer4.Contrib.CosmosDB .Если вы посмотрите на исходный код (очень незавершенный), вы получите общее представление о том, как реализовать свой собственный поставщик БД, который изящно справляется с таким требованием.На самом деле, вы можете гипотетически подумать об использовании хранилища данных NoSQL для IDServer, поскольку я считаю, что он «оптимизирован» для многозонных операций чтения / записи по сравнению с SQL Server.

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

Маловероятно, что вы найдете рекомендуемую архитектуру для подобного сценария из-за того, как много этой проблемы находится в вашей бизнес-сфере.Кроме того, в библиотеке Identity Server 4 или ее вспомогательных библиотеках нет ничего, что соответствовало бы вашим критериям.

Сказав это, у меня было похожее требование (не связанное с Identity Server 4, но в двух словах идентичные функциональные требования), и должна быть возможность адаптировать ту же идею в вашем случае.

Во-первых, ваша единственная проблема, как вы сказали, заключается в том, что из коробки, используя пакет Edentity Server 4 EF, PersistedGrantStore использует один IPersistedGrantDbContext, который выполняет как запись, так и чтение из базы данных.Таким образом, чтобы решить эту проблему, вам необходимо создать собственную реализацию IPersistedGrantStore, и в этой пользовательской реализации вы можете технически использовать два разных типа DbContext, один из которых будет создан с использованием строки подключения к одному доступному для записи экземплярубазы данных и будет использоваться только для реализации методов интерфейса, которые выполняют запись, а другой будет использоваться только для методов чтения и будет использовать строку подключения для экземпляра базы данных только для чтения.

Основная идея приведенного выше резюме приведена ниже:

public class MyCustomPersistedGrantStore : IPersistedGrantStore
{
    private readonly WriteOnlyPersistedGrantDbContext _writeContext;
    private readonly ReadOnlyPersistedGrantDbContext _readContext;  

    public PersistedGrantStore(WriteOnlyPersistedGrantDbContext writeContext, ReadOnlyPersistedGrantDbContext readContext)
    {
        _writeContext = writeContext;
        _readContext = readContext;
    }

    public Task StoreAsync(PersistedGrant token)
    {
        //Use _writeContext to implement storage logic
    }

    public Task<PersistedGrant> GetAsync(string key)
    {
        //Use _readContext to implement read logic
    }

    ...other interface methods
}

Все, что вам нужно после реализации вашей пользовательской версии, - это добавить вашу реализацию IPersistedGrantStore, а также DbContext в систему DI.

Наконец, этоСтоит отметить, что если вы перестанете использовать .AddOperationalStore(...config), то вы также утратите использование TokenCleanupHostService, поэтому вам также потребуется реализовать это.

...