OpenIdConnect — При использовании нескольких схем и клиентов проверка состояния, похоже, завершается неудачей

#asp.net-core #security #openid-connect

Вопрос:

Я использую OpenIdConnect для аутентификации пользователей с помощью нескольких органов аутентификации и различными методами.

Я получал ошибки из-за использования нескольких идентификаторов клиентов, и я последовал некоторым советам использовать отдельный URL обратного вызова для каждого клиента. Все начало работать нормально, но когда я включаю такую проверку состояния, она снова начинает давать сбои:

             authenticationBuilder
                .AddOpenIdConnect(authProvider.Code, authProvider.Name, options =>
                 {
                     options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                     options.SignOutScheme = IdentityServerConstants.SignoutScheme;

                     options.Authority = authProvider.Authority;
                     options.CallbackPath = $"/signin-{authProvider.Code}";
                     options.ClientId = authProvider.ClientId;
                     options.ClientSecret = authProvider.ClientSecret;
                     options.ResponseType = "code";

                     options.SaveTokens = true;

                     // !!!!!!!!!! These two lines seem needed to validate the state, but cause the problem.
                     options.ProtocolValidator.RequireState = true;
                     options.ProtocolValidator.RequireStateValidation = true;
                    ....
 

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

 System.Exception: Unable to unprotect the message.State.

   at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.HandleRequestAsync()
   at IdentityServer4.Hosting.FederatedSignOut.AuthenticationRequestHandlerWrapper.HandleRequestAsync()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at IdentityServer4.Hosting.BaseUrlMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)
 

Если я удалю две строки для проверки состояния, все выглядит хорошо, но я не хочу пропускать проверку состояния.
Есть какие-нибудь идеи, почему это происходит и что я должен делать?

Документация очень тонкая, и лучшее, что я нашел, это то, где происходит это обсуждение:

 -- Is is a desired behavior that RequireStateValidate=true and RequireState=true is not supported and produce an exception ?

-- Yes, that's the current design.
 

Я не понимаю, почему это не удается, но отключение RequireStateValidate , похоже, предотвращает проверку, что мне не нравится.