场景是这样的,我有一个项目,前后端分离,也没有完全分离
他们在同一个项目中,前端通过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);
//};
本文链接:https://blog.nnwk.net/article/52
有问题请留言。版权所有,转载请在显眼位置处保留文章出处,并留下原文连接
Leave your question and I'll get back to you as soon as I see it. All rights reserved. Please keep the source and links
友情链接:
子卿全栈
全部评论