我正在使用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;
};与上面的代码一样,我手动设置了"state“属性(这是由ASP.Net核心团队建议的,而不是完全相同的方式)。参考下面的github问题链接),但它不起作用。
在回调时,它以".AspNetCore.Correlation.状态属性未找到“发出警告,然后将失败(如github下面所示)作为”来自RemoteAuthentication的错误:关联失败..“。
https://github.com/aspnet/AspNetCore/issues/7501
那我做错什么了。因为在上面的bug中给出的建议是不可能的,因为它有一些我在这个事件中没有的值。
我缺少什么(或者必须做什么来完成这个流程)?
发布于 2019-02-16 08:33:05
状态可以设置如下。(必须经过不同性质的相关和发现。)
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-18 08:58:01
我通过将原始context.ProtocolMessage.State存储在context.Properties.Items中使其工作。
var message = context.ProtocolMessage;
if (!string.IsNullOrEmpty(message.State))
{
context.Properties.Items[OpenIdConnectDefaults.UserstatePropertiesKey] = message.State;
}https://stackoverflow.com/questions/54714529
复制相似问题