.AspNetCore.Correlation. госимущество не найдено. Неизвестное местоположение

Я использую гибридный поток аутентификации с OIDC.

options.Events.OnRedirectToIdentityProvider = redirectContext =>
                      {
                          if (redirectContext.Request.Path.StartsWithSegments("/api"))
                          {
                              if (redirectContext.Response.StatusCode == (int)HttpStatusCode.OK)
                              {
                                  AuthenticationProperties  properties = new AuthenticationProperties();
                                  properties.RedirectUri = redirectContext.ProtocolMessage.RedirectUri;
                                  redirectContext.ProtocolMessage.State = options.StateDataFormat.Protect(properties);
                                  redirectContext.Response.StatusCode =   (int)HttpStatusCode.Unauthorized;
                                  redirectContext.Response.Headers["Location"] = redirectContext.ProtocolMessage.CreateAuthenticationRequestUrl();
                              }
                              redirectContext.HandleResponse();
                          }
                          return Task.CompletedTask;
                      };

Как и в приведенном выше коде, я вручную установил свойство «состояние» (которое было предложено основной командой ASP.Net, но не точно таким же образом. См. Ниже ссылку на проблему github), но оно не работает.

При обратном вызове выдается предупреждение в виде «.AspNetCore.Correlation. State property not found», а затем происходит сбой (согласно приведенной ниже ошибке github) как «Ошибка удаленной аутентификации: сбой корреляции .. < / strong> "

https://github.com/aspnet/AspNetCore/issues/7501

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

что мне не хватает (или что я должен сделать, чтобы завершить этот поток)?


person Anonymous Creator    schedule 15.02.2019    source источник


Ответы (2)


состояние может быть установлено следующим образом. (Пришлось перебирать разные свойства релевантного и найденного.)

options.Events.OnRedirectToIdentityProvider = redirectContext =>
                      {
                          if (redirectContext.Request.Path.StartsWithSegments("/api"))
                          {
                              if (redirectContext.Response.StatusCode == (int)HttpStatusCode.OK)
                              {
                                  redirectContext.ProtocolMessage.State = options.StateDataFormat.Protect(redirectContext.Properties);
                                  redirectContext.Response.StatusCode =   (int)HttpStatusCode.Unauthorized;
                                  redirectContext.Response.Headers["Location"] = redirectContext.ProtocolMessage.CreateAuthenticationRequestUrl();
                              }
                              redirectContext.HandleResponse();
                          }
                          return Task.CompletedTask;
                      };
person Anonymous Creator    schedule 16.02.2019

Я заставил его работать, сохранив исходный context.ProtocolMessage.State в context.Properties.Items:

var message = context.ProtocolMessage;
if (!string.IsNullOrEmpty(message.State))
{
    context.Properties.Items[OpenIdConnectDefaults.UserstatePropertiesKey] = message.State;
}
person Tomáš Herceg    schedule 18.02.2019