.Net Core 2.1的OpenIdConnectProtocolException

3
我有一个.NET Core 2.1应用程序,我正在使用它来尝试在AWS中测试我的新Identity Server 4部署。这两个程序在我的本地机器上运行得很完美,在那里我可以通过IS4进行身份验证,并使用所有的登录信息被重定向到我的应用程序中。但是在我的部署服务器上情况并非如此,我不确定原因。我在我的IS4服务器上没有看到任何错误,它看到了我的客户端并验证了请求。然而,在我的本地机器上,我的项目会出现以下错误:
System.Exception: An error was encountered while handling the remote login. ---> Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolException: Message contains error: 'invalid_request', error_description: 'error_description is null', error_uri: 'error_uri is null'.
   at Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.RedeemAuthorizationCodeAsync(OpenIdConnectMessage tokenEndpointRequest)
   at Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.HandleRemoteAuthenticateAsync()
   --- End of inner exception stack trace ---
   at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.HandleRequestAsync()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

当我调用以下代码:

return Challenge(new AuthenticationProperties
                {
                    RedirectUri = "Home/Index"
                }, "challenge");

本地程序的启动流程如下:
services.AddAuthentication(options =>
                {
                    options.DefaultScheme = "Cookie";
                    options.DefaultChallengeScheme = "challenge";
                    //options.DefaultSignInScheme = IdentityServerConstants.DefaultCookieAuthenticationScheme;
                    //options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                })
                .AddCookie("Cookie")
                .AddOpenIdConnect("challenge", options =>
                {
                    options.Authority = "http://auth.is4server.com";
                    //options.Authority = "http://localhost:5000";
                    options.SignInScheme = "Cookie";
                    options.RequireHttpsMetadata = false;
                    options.ClientId = "mvc";
                    options.ClientSecret = "secret";
                    options.ResponseType = "code id_token";
                    options.SaveTokens = true;
                    options.GetClaimsFromUserInfoEndpoint = true;
                    options.Scope.Add("offline_access");
                    options.Scope.Add("profile");
                    options.Scope.Add("accunet");

                });

看起来它会重定向到IS4登录页面,然后立即尝试使用以前的错误信息重定向回我的重定向URI,即 localhost:5002/signin-oidc。我已确认我的本地机器和AWS实例上的所有IS4配置都相同。

我不确定为什么这不起作用,尝试重定向到我的本地机器是否有任何问题?错误似乎没有给我很多细节和网络响应。

在此之前,它至少会让我尝试登录到IS4登录页面,然后将我重定向回signin-oidc。现在它甚至无法到达登录页面,总是带着错误重定向到signin-oidc。我已清除了cookies并重启了服务器和本地项目,但没有效果。

如果有帮助,将不胜感激。


你找到这个问题的答案了吗? - Nouman Bhatti
2个回答

3
问题与我在AWS中的负载均衡器有关。由于IS4服务器位于此负载均衡器后面,所有2个AWS远端网关容器之间的内部流量都使用HTTP通信。因此,您需要将您的授权设置为HTTP。
然而,我在AWS集群上还有一个策略,将所有流量重定向到HTTPS。由于这个冲突,每当我调用options.Authority = "http://auth.is4server.com";时,它会尝试重定向到"https://auth.is4server.com";,但由于它是内部Far Gate,不允许这样做。
解决方案是添加options.Origin = "https://auth.is4server.com";,因此发现文档具有安全端点,并且不会尝试重定向。

2
由于在ASP.NET Core 3.1中options.Origin不可用,您能告诉我您是如何解决这个问题的吗? - Abhimanyu

0
在我的情况下,当身份验证失败时(例如用户取消登录时),错误会发生。在这种情况下,将OnRemoteFailure重定向设置如下可以解决问题:
    services.AddAuthentication(options =>
        {
            ///.... removed for brevity
           

        })

        .AddCookie("Cookies", (options) =>
        {
            // Removed for brevity

        })

       
        .AddOpenIdConnect("oidc", options =>
        {
           // Removed for brevity


            //If remote login failed( example user canceled login)
            //====================================================
            options.Events = new OpenIdConnectEvents
            {
                OnRemoteFailure = (context) =>
                {
                    context.Response.Redirect("/");
                    context.HandleResponse();
                    return Task.CompletedTask;
                }
            };
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接