.AspNetCore.Correlation。未找到状态 属性。未知位置
.AspNetCore.Correlation. state property not found. Unknown Location
我正在使用 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 问题link),但它不起作用。
回调时,它会发出 ".AspNetCore.Correlation 警告。状态 属性 not found" 然后失败(如下所示 github 错误)作为“来自 RemoteAuthentication 的错误:关联失败..”
https://github.com/aspnet/AspNetCore/issues/7501
所以我做错了什么。因为在上面的错误中给出的建议是不可能的,因为它有一些我在这个事件中没有的值。
我缺少什么(或必须做什么才能完成此流程)?
状态可以设置如下。 (必须通过相关的不同属性才能找到。)
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;
};
我通过将原始 context.ProtocolMessage.State
存储在 context.Properties.Items
中来使其工作:
var message = context.ProtocolMessage;
if (!string.IsNullOrEmpty(message.State))
{
context.Properties.Items[OpenIdConnectDefaults.UserstatePropertiesKey] = message.State;
}
我正在使用 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 问题link),但它不起作用。
回调时,它会发出 ".AspNetCore.Correlation 警告。状态 属性 not found" 然后失败(如下所示 github 错误)作为“来自 RemoteAuthentication 的错误:关联失败..”
https://github.com/aspnet/AspNetCore/issues/7501
所以我做错了什么。因为在上面的错误中给出的建议是不可能的,因为它有一些我在这个事件中没有的值。
我缺少什么(或必须做什么才能完成此流程)?
状态可以设置如下。 (必须通过相关的不同属性才能找到。)
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;
};
我通过将原始 context.ProtocolMessage.State
存储在 context.Properties.Items
中来使其工作:
var message = context.ProtocolMessage;
if (!string.IsNullOrEmpty(message.State))
{
context.Properties.Items[OpenIdConnectDefaults.UserstatePropertiesKey] = message.State;
}