Несколько экземпляров одного клиента в сервере идентификации генерируют исключение - PullRequest
0 голосов
/ 08 января 2020

В моем проекте для авторизации я использую IID-сервер OpenId Connect.

Одним из клиентов Identity является тип MVC.

Для масштабируемости мне нужно несколько реплик работающего клиента.

Когда номер клиента равен 1 (работает только один экземпляр), все отлично.

При увеличении количества клиентов до 2, после развертывания при просмотре страниц, требующих авторизации

  1. Перенаправление на сервер идентификации (как я и ожидал)
  2. После успешного входа в систему Identity устанавливает файлы cookie в домен сервера идентификации (как я и ожидал)
  3. Я ожидал, что после перенаправления в клиентском домене будут установлены MVC клиентские куки-файлы и авторизован пользователь, но выброшено это исключение:

Исключение: невозможно снять защиту сообщения. Состояние.

Неизвестное местоположение

Исключение: при обработке удаленного входа произошла ошибка.

MVC Настройки клиента OpenIdConnect:

"OpenIdConnect": {
    "ClientId": "mvc",
    "Authority": "https://identity.usw1.kubesail.io/",
    "ClientSecret": "REDACTED",
    "ResponseType": "code",
    "UsePkce": false,
    "GetClaimsFromUserInfoEndpoint": true,
    "SaveTokens": false,
    "RequireHttpsMetadata": false,
    "Scope": [ "openid", "profile" ],
}

Настройка сервера идентификации для MVC Клиент

new Client
{
    ClientId = "mvc",
    ClientName = "MVC Client",

    AllowedGrantTypes = GrantTypes.CodeAndClientCredentials,
    RequirePkce = false,
    ClientSecrets = { new Secret("REDACTED".Sha256()) },

    RedirectUris = { "http://mvc.c1.kubesail.io/signin-oidc" },
    FrontChannelLogoutUri = "http://mvc.c1.kubesail.io/signout-oidc",
    PostLogoutRedirectUris = { "http://mvc.c1.kubesail.io/signout-callback-oidc" },
    RequireConsent = false,

    AllowOfflineAccess = true,
    AllowedScopes = { "openid", "profile" }
}

Спецификация разработки и развертывания:

Сервер идентификации 4

Типы проектов: Asp. net core 3.1

Развертывание в Kubernetes

1 Ответ

0 голосов
/ 09 января 2020

Вам нужно липкая сессия [ссылка] на вашем LoadBalancer или Ingress, поскольку я вижу, что вы используете Kubernetes.

В режиме слипания при первом обращении пользователя к вашему приложению входной контроллер устанавливает повара ie и отображает значение повара ie с помощью модуля. Каждый раз, когда пользователь «разговаривает» с вашим приложением или делает какой-либо другой запрос, служба доступа может прочитать этот код ie и всегда перенаправить вас к одному и тому же модулю.

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

Кстати: пожалуйста, не делитесь секретом своего клиента!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...