The given key 'OpenIdConnect.Code.RedirectUri' was not present in the dictionary.

1/25/2022 4:00:05 PM
609
0

场景是这样的,我有一个项目,前后端分离,也没有完全分离

他们在同一个项目中,前端通过ajax调用后端的数据

我正在做授权验证这块儿,使用的中间件是identityServer4 

由于使用ajax 调用后端接口,所以权限验证这里不能302 直接跳转了,因为涉及到跨域,302无法被捕获,又无法跨域

所以我配置了后端接口返回401,给前端

                  //在重定向到身份提供程序进行身份验证之前调用
                  options.Events.OnRedirectToIdentityProvider = context =>
                  {

                      if (context.Response.StatusCode == (int)HttpStatusCode.OK && context.Request.IsAjax())
                      {
                          (1)context.Properties.RedirectUri = $"{context.Request.Scheme}://{context.Request.Host}{context.Request.PathBase}";
                          (2)context.Properties.Items.Add(OpenIdConnectDefaults.RedirectUriForCodePropertiesKey, context.ProtocolMessage.RedirectUri);
                          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;
                  };

配置如上问代码,最开始是没有(1)(2)两项的,很好,后端返回了401响应代码,并且将授权跳转地址放入了Header的 Location中了

我在前端监测了401响应,并使用Location 进行跳转和授权

此时一切都显得顺利,值得庆祝。

但是当我点击,yes,a  know 按钮,同意了授权。此时我的客户端出现了error ,报告了这样一个问题

KeyNotFoundException: The given key 'OpenIdConnect.Code.RedirectUri' was not present in the dictionary.

Below is the callstack.

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

What's wrong?

很显然,授权完毕跳转回来的页面不在信任列表中

经过一个上午的努力,我成功的找到了这篇文章给我了重大帮助 https://stackoverflow.com/questions/54721518/keynotfoundexception-the-given-key-openidconnect-code-redirecturi-was-not-pre

为什么经过了一个上午我才找到这个答案呢,这是一个伤心的事情

我配置了这个代码掩饰了错误,让我一直没看到真正的错误原因

                  //options.Events.OnRemoteFailure = context =>
                  //{
                  //        //授权拒绝时候将执行这个代码
                  //        context.HandleResponse();
                  //       context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                  //        //context.Response.Redirect("/");
                  //        context.Response.WriteAsync("未能验证的授权", Encoding.GetEncoding("GB2312"));
                  //       return Task.FromResult(0);
                  //};

 

全部评论



提问