Asp.net core ASP.NET核心应用程序使用IdentityServer 3进入无限的身份验证循环

Asp.net core ASP.NET核心应用程序使用IdentityServer 3进入无限的身份验证循环,asp.net-core,.net-core,identityserver3,openid-connect,coreclr,Asp.net Core,.net Core,Identityserver3,Openid Connect,Coreclr,背景 我们有ASP.Net核心应用程序,该应用程序已投入生产1年。最近,我们将我们的应用程序从VS 2015转换为VS 2017。所以我们从基于json的项目转向基于csproj的项目。我们还将.NET核心运行时框架升级到1.1.2 应用程序正在使用centralizeIdentityServer 3进行使用OpenIDConnect的身份验证 转换后,我们将应用程序发布到开发服务器。应用程序托管在IIS下。因此,我们在development server上安装了以下组件: Microsoft

背景
我们有ASP.Net核心应用程序,该应用程序已投入生产1年。最近,我们将我们的应用程序从VS 2015转换为VS 2017。所以我们从基于json的项目转向基于csproj的项目。我们还将
.NET核心运行时框架升级到1.1.2

应用程序正在使用centralize
IdentityServer 3
进行使用OpenIDConnect的身份验证

转换后,我们将应用程序发布到开发服务器。应用程序托管在IIS下。因此,我们在development server上安装了以下组件:

  • Microsoft.NET Core 1.1.2–运行时(x64)
  • Microsoft.NET Core 1.0.5& 1.1.2–Windows服务器托管
在开发服务器上,一切正常,我们测试了应用程序,没有任何问题

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

问题
在产品中,当我们登录时,identity server会进入无限的身份验证循环。Fiddler显示了从identityServer到web站点的多次往返。每次往返都会将
.AspNetCore.OpenIdConnect.Nonce
.AspNetCore.Correlation.oidc
添加到cookie中,最终由于最大请求大小,我会收到错误的请求错误

有几个帖子(,)与同一问题相关。解决方案是将Microsoft.Owin.Security.OpenIdConnect降级为3.0.0
但是,我的客户端应用程序不是典型的ASP.NET应用程序,而是使用
Microsoft.AspNetCore.Authentication.OpenIdConnect 1.1.2
还请注意,它在开发服务器上使用的是相同的centralize identity server 3和相同版本的
Microsoft.AspNetCore.Authentication.OpenIdConnect 1.1.2

因此,我猜测以下可能是错误的:

  • 我可能忘了在生产服务器上安装一些东西( 当然,我已经安装了.NET Core 1.1.2运行时和Windows Server 托管,我不确定是否需要在生产环境中安装其他内容)
  • 我可能没有正确配置IIS(但是什么?)
  • 在生产服务器上,如何知道应用程序的版本 正在运行。(在.csproj中的Visual Studio中)
    netcoreapp1.1
    但我怎么知道 发布的代码正在使用的版本)
  • 开发服务器和生产服务器之间的唯一区别是,开发服务器安装了classic.NET Framework
    4.7
    ,生产服务器安装了classic.NET Framework
    4.6.2
    。但是,我认为这不应该引起问题,因为该应用程序是ASP.NET核心应用程序,而不是经典的.NET Framework应用程序

  • 我对所有的想法都感到筋疲力尽,任何帮助都将不胜感激

    这可能不是实际问题,但我以前在Azure Active Directory环境中遇到过这个问题。在我的例子中,我只是在没有HTTPS的情况下访问应用程序时才进入这个重定向循环。我猜这和cookie及其安全标志有关。我可能弄错了

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

    有关更多上下文,请参阅。

    找到了它。。 基本上,我们在
    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                        
                        }
                    }
                };
    
    我们修复了数据库连接问题,然后一切正常