#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
, похоже, предотвращает проверку, что мне не нравится.