我正在使用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。state属性未找到”的形式发出警告。,然后由于“ RemoteAuthentication错误:关联失败”而失败(根据github错误) .. ”
https://github.com/aspnet/AspNetCore/issues/7501
所以我在做什么错。因为上面的bug中的建议是不可能的,因为它具有一些我在此事件中没有的值。
我缺少什么(或者必须完成此流程)?
答案 0 :(得分:1)
状态可以如下设置。 (必须经历相关和发现的不同属性。)
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;
};
答案 1 :(得分:1)
我通过将原始context.ProtocolMessage.State
存储在context.Properties.Items
中来使其工作:
var message = context.ProtocolMessage;
if (!string.IsNullOrEmpty(message.State))
{
context.Properties.Items[OpenIdConnectDefaults.UserstatePropertiesKey] = message.State;
}