.AspNetCore.Correlation。找不到国家财产。位置不明

时间:2019-02-15 17:44:15

标签: c# asp.net-core asp.net-identity asp.net-core-2.1 asp.net-core-security

我正在使用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;
                      };

就像上面的代码一样,我手动设置了“ state”属性(由ASP.Net核心团队建议,并非完全相同。请参见下面的github问题链接),但是它不起作用。

在回调中,它以“。AspNetCore.Correlation。state属性未找到”的形式发出警告。,然后由于“ RemoteAuthentication错误:关联失败”而失败(根据github错误) ..

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

所以我在做什么错。因为上面的bug中的建议是不可能的,因为它具有一些我在此事件中没有的值。

我缺少什么(或者必须完成此流程)?

2 个答案:

答案 0 :(得分:1)

状态可以如下设置。 (必须经历相关和发现的不同属性。)

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

答案 1 :(得分:1)

我通过将原始context.ProtocolMessage.State存储在context.Properties.Items中来使其工作:

var message = context.ProtocolMessage;
if (!string.IsNullOrEmpty(message.State))
{
    context.Properties.Items[OpenIdConnectDefaults.UserstatePropertiesKey] = message.State;
}