【问题标题】:KeyNotFoundException: The given key 'OpenIdConnect.Code.RedirectUri' was not present in the dictionaryKeyNotFoundException:字典中不存在给定键“OpenIdConnect.Code.RedirectUri”
【发布时间】:2019-07-10 07:35:50
【问题描述】:

我正在将 vue cli 中间件与带有 Hybrid Flow 的 identityserver 一起使用。 在 Ajax 调用中,我已手动重定向到 identityprovider,如下所示。

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

在来自身份服务器的回调中,我遇到了以下错误。

KeyNotFoundException:给定的键“OpenIdConnect.Code.RedirectUri”不在字典中。

下面是调用栈。

Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler.HandleRequestAsync() Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext 上下文) Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext 上下文) Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext 上下文) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

怎么了?

我正在使用来自以下 repo 的身份服务器。

https://github.com/IdentityServer/IdentityServer4

我的分叉回购(上面的代码)

https://github.com/hnviradiya/asp-net-core-vue-starter

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc identityserver4 asp.net-core-2.1


    【解决方案1】:
    options.Events.OnRedirectToIdentityProvider = redirectContext =>
                          {
                              if (redirectContext.Request.Path.StartsWithSegments("/api"))
                              {
                                  if (redirectContext.Response.StatusCode == (int)HttpStatusCode.OK)
                                  {
                                      redirectContext.Properties.RedirectUri = $"{redirectContext.Request.Scheme}://{redirectContext.Request.Host}{redirectContext.Request.PathBase}";
                                      redirectContext.Properties.Items.Add(OpenIdConnectDefaults.RedirectUriForCodePropertiesKey, redirectContext.ProtocolMessage.RedirectUri);
                                      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;
                          };
    

    【讨论】:

    • 感激不尽!你用这个答案+上一个关于缺失状态的答案保存了可能的一天。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2018-08-14
    • 2012-02-18
    相关资源
    最近更新 更多