ASP.NET Core应用程序通过IdentityServer3进入无限循环身份验证

时间:2017-09-23 20:36:39

标签: asp.net-core .net-core identityserver3 openid-connect coreclr

背景
我们有ASP.Net核心应用程序,已生产最近1年。最近我们将我们的应用程序从VS 2015转换为VS 2017.所以我们从基于json的项目转移到基于csproj的项目。我们还升级了.NET Core runtime framework to 1.1.2

应用程序使用集中IdentityServer3进行身份验证,使用OpenIDConnect。

转换后,我们将应用程序发布到我们的开发服务器。该应用程序托管在IIS下。所以我们在开发服务器上安装了以下内容:

  • Microsoft .NET Core 1.1.2 - 运行时(x64)
  • Microsoft .NET Core 1.0.5& 1.1.2 - Windows服务器托管

在开发服务器上一切都很顺利,我们测试了应用程序没有任何问题。

然后我们在生产服务器上安装相同的.Net Core framework 1.1.2和Windows Server Hosting。并将相同的已发布文件夹从开发服务器复制到生产服务器,并相应地更新appsettings.json

问题
在我们登录时的生产中,身份服务器进入无限循环的身份验证。 Fiddler展示了从identityServer到网站的几次往返旅行。每次往返都会将.AspNetCore.OpenIdConnect.Nonce.AspNetCore.Correlation.oidc添加到Cookie中,最终由于最大请求大小而导致错误的请求错误。

有几个帖子(here hereherehere)与同一问题相关。解决方案是将Microsoft.Owin.Security.OpenIdConnect降级为3.0.0
但是我的客户端应用程序不是使用Microsoft.AspNetCore.Authentication.OpenIdConnect 1.1.2的ASP.NET核心应用程序的经典ASP.NET应用程序 并且还要注意它在开发服务器上使用相同的集中身份服务器3和相同版本的Microsoft.AspNetCore.Authentication.OpenIdConnect 1.1.2

所以我猜测以下可能是错误的:

  1. 我可能忘了在生产服务器上安装一些东西( 我确实安装了.NET Core 1.1.2运行时和Windows Server 托管,我不确定我需要在生产上安装什么)
  2. 我可能没有正确配置IIS(但是什么?)
  3. 在生产服务器上如何知道应用程序的版本 正在奔跑。 (在.csproj中的Visual Studio中 <TargetFramework>netcoreapp1.1</TargetFramework>但我怎么知道 发布的代码使用的版本)
  4. 开发服务器和生产服务器之间的唯一区别是,开发服务器安装了经典的.NET Framework 4.7,并且生产安装了经典的.NET Framework 4.6.2。但是我认为这不应该导致问题因为应用程序是ASP.NET核心应用程序而不是经典的.NET Framework应用程序
  5. 我对所有想法都很累,任何帮助都会非常感激

2 个答案:

答案 0 :(得分:1)

发现它.. 基本上我们在OnTokenValidated事件上有代码,它从本地数据库中获取经过身份验证的用户信息。那是失败的

var connectOptions = new OpenIdConnectOptions()
            {              
                AutomaticChallenge = true,
                Authority = authority,
                ClientId = clientId,
                ResponseType = IdentityConstant.ResponseType,
                AuthenticationScheme = IdentityConstant.OpenIdAuthenticationScheme,
                SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme,               
                CallbackPath = IdentityConstant.CallbackPath,
                Events = new OpenIdConnectEvents()
                {
                    OnTokenValidated = async context =>
                    {                        

                        // get email claim
                        var emailClaim = context.Ticket.Principal.Claims.SingleOrDefault(x => x.Type == IdentityClaimTypes.Email);
                        if (emailClaim == null)
                        {
                            throw new NoEmailClaimException("Could not find email claim.");
                        }

                        // this line was failing
                        var userInfo = await domainService.GetInfo(emailClaim.Value).ConfigureAwait(false);

                        // Do some stuff here                        
                    }
                }
            };

我们修复了数据库连接问题,然后一切都很好

答案 1 :(得分:0)

这可能不是实际问题,但我之前已经在Azure Active Directory的上下文中遇到过此问题。就我而言,当我在没有HTTPS的情况下访问应用程序时,我才进入此重定向循环。我猜它与cookie及其安全标志有关。我可能会误会。

我通过IIS URL重写规则在我的应用程序上强制使用HTTPS,然后问题就解决了。

有关更多背景信息,请参阅this GitHub issue comment