3

我正在使用 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 bug)“来自 RemoteAuthentication 的错误:Correlation failed..

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

那么我做错了什么。因为上述错误中给出的建议是不可能的,因为它有一些我在这个事件中没有的值。

我错过了什么(或必须做些什么才能完成这个流程)?

4

2 回答 2

4

状态可以设置如下。(必须经过不同的相关属性才能找到。)

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;
                      };
于 2019-02-16T08:33:05.613 回答
2

我通过将原件存储context.ProtocolMessage.Statecontext.Properties.Items

var message = context.ProtocolMessage;
if (!string.IsNullOrEmpty(message.State))
{
    context.Properties.Items[OpenIdConnectDefaults.UserstatePropertiesKey] = message.State;
}
于 2019-02-18T08:58:01.200 回答