我正在使用带有混合流的身份服务器的vue cli中间件。在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;
};
在来自identityserver的回调中,我收到了以下错误。
KeyNotFoundException:字典中不存在给定键“OpenIdConnect.Code.RedirectUri”。
下面是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)
怎么了?
我正在使用来自repo的identityserver。
https://github.com/IdentityServer/IdentityServer4
我的分叉回购(带上面的代码)
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;
};