我正在尝试使用OIDC进行模拟。我知道,这不是一个好主意,但是我对此没有选择。
尽管如此,我基本上是通过篡改acr_values使其正常工作的。您将要看到的代码仅用于测试目的,但是异常消息使我感到好奇。
为了向您展示我的设置,这就是我所拥有的:
services
.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options => {
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ClientId = "test.client";
options.ClientSecret = "secret";
options.ResponseType = "id_token token";
options.Scope.Add("openid");
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProvider = context =>
{
context.ProtocolMessage.SetParameter("acr_values", "impersonatedUserId:1234");
return Task.FromResult(0);
}
{
});
请注意,我使用IdentityServer4作为授权服务器。
这会给我以下异常消息
Exception: OpenIdConnectAuthenticationHandler: message.State is null or empty.
堆栈跟踪并没有真正给我任何有用的信息,因此不需要在这里发布它。
然而,有趣的是,如果我要删除OnRedirectToIdentityProvider
事件,除了我无法模拟其他用户这一事实之外,其他一切都正常。
由于我是OAuth和OIDC的新手,所以我对这里实际发生的事情很感兴趣。为什么会抛出此异常,为什么仅在重定向到IDP之前拦截请求时才会发生?此message.State是什么?在哪里可以找到并检查它?还是像大多数具有dotnet核心的OAuth和OIDC一样在幕后?
您收到的错误是一般性错误,可能是由于配置错误或网络问题引起的。我建议您在不使用OpenIdConnectEvents
拳头的情况下使其端到端工作。然后,要进行模拟,您需要在自定义acr_values
中检查IAuthorizeInteractionResponseGenerator
。 here是一个示例。