Проверка подписи не удалась, когда за балансировщиком нагрузки - PullRequest
0 голосов
/ 27 сентября 2018

У меня в настоящее время Identity Server 4 работает на одном сервере, работает нормально и никаких проблем, за исключением случаев, когда я помещаю балансировщик нагрузки (Kemp) перед Identity Server 4, я получаю следующую ошибку ПОСЛЕ аутентификации и перенаправления обратно наодно из моих приложений.

IDX10500: Ошибка проверки подписи.Невозможно разрешить SecurityKeyIdentifier:

SecurityKeyIdentifier
    (
        IsReadOnly = False,
        Count = 1,
        Clause[0] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause
    )

Я рассмотрел вопрос переполнения стека, расположенный здесь ( Ошибка проверки подписи ), и у меня уже установлен сертификат SSL на обоих серверах, расположенных заБалансировщик нагрузки.Кроме того, я также прочитал статью о том, как установить публичное происхождение на сайте Доминика, что я и сделал - эта статья находится здесь: https://leastprivilege.com/2017/10/09/new-in-identityserver4-v2-simplified-configuration-behind-load-balancers-or-reverse-proxies/

Каков следующий шаг по устранению ошибки / проблемыперечисленные выше?

Заранее благодарим за помощь!

1 Ответ

0 голосов
/ 28 сентября 2018

Причина, по которой вы испытываете это, заключается в том, что вы не сохраняете ключи защиты данных.В основном IdentityServer реализует защиту данных InMemory, но с балансировщиком нагрузки это не работает для вас.

Что вам нужно сделать, это внедрить IXmlRepository и добавить собственную защиту данных.Он добавляется в startup.cs и очень важен , чтобы добавить его в конвейер после добавления IdentitiyServer.Что-то вроде:

services.AddIdentityServer()
.
.
.more code here (like AddProfileService() etc.)
.
.

И затем (позже в конвейере) вам нужно:

serviceProvider = services.BuildServiceProvider();
services.AddDataProtection()
    .AddKeyManagementOptions(options =>
    {
        options.XmlRepository = serviceProvider.GetService<IXmlRepository>();
    })
    .SetDefaultKeyLifetime(TimeSpan.FromDays(7))
    .ProtectKeysWithCertificate(cert)
    .SetApplicationName("Application name");

Перед этим вам необходимо зарегистрировать в DI вашу реализацию IXmlRepository,В моем случае:

services.AddSingleton<IXmlRepository, DataProtectionKeyStore>();

Где DataProtectionKeyStore - это реализация IXmlRepository.

Здесь - несколько примеров из официальных документов Microsoft для сохраненияэти ключи, или если вы хотите использовать базу данных, вы также можете реализовать свою собственную логику (это то, что я сделал).

Все вышеперечисленное, конечно, если все с вашим сертификатом в порядке (как выговорят).Но так и должно быть, если он работает, когда не за балансировщиком нагрузки.

...