.AspNetCore.Correlation.государственная собственность не найдена.Неизвестное место - PullRequest
0 голосов
/ 15 февраля 2019

Я использую гибридный поток аутентификации с 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. Состояние не найдено" , а затем происходит сбой (согласно приведенной ниже ошибке github) как " Ошибка удаленной аутентификации:Корреляция не удалась .."

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

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

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

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

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

var message = context.ProtocolMessage;
if (!string.IsNullOrEmpty(message.State))
{
    context.Properties.Items[OpenIdConnectDefaults.UserstatePropertiesKey] = message.State;
}
0 голосов
/ 16 февраля 2019

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

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;
                      };
...