asp.net-core - ASP.NET Core 应用程序进入 IdentityServer3 身份验证的无限循环

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

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

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

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

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

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

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

问题
在生产中,当我们登录时,身份服务器会进入身份验证的无限循环。 Fiddler 显示了从 IdentityServer 到网站的多次往返。每次往返不断添加.AspNetCore.OpenIdConnect.Nonce.AspNetCore.Correlation.oidc进入 cookie,最终由于最大请求大小,我收到了错误的请求错误。

有多个帖子( here hereherehere )与同一问题相关。解决方案是将 Microsoft.Owin.Security.OpenIdConnect 降级到 3.0.0
但是,我的客户端应用程序不是经典的 ASP.NET 应用程序,而是使用 Microsoft.AspNetCore.Authentication.OpenIdConnect 1.1.2 的 ASP.NET Core 应用程序。 另请注意,它在具有相同集中身份服务器 3 和相同版本 Microsoft.AspNetCore.Authentication.OpenIdConnect 1.1.2 的开发服务器上工作。

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

  1. 我可能忘记在生产服务器上安装某些东西( 确保我已经安装了 .NET Core 1.1.2 运行时和 Windows Server 托管,我不确定在生产中还需要安装什么)
  2. 我可能没有正确配置 IIS(但是什么?)
  3. 在生产服务器上我如何知道应用程序处于什么版本 正在运行。 (在 Visual Studio 中的 .csproj 中 <TargetFramework>netcoreapp1.1</TargetFramework>但我怎么知道 发布的代码使用的是什么版本)
  4. 开发服务器和生产服务器之间的唯一区别是,开发服务器具有经典的.NET Framework 4.7安装和生产具有经典的.NET Framework 4.6.2安装。不过,我认为这不会引起问题,因为该应用程序是 ASP.NET Core 应用程序,而不是经典的 .NET Framework 应用程序

我已经厌倦了所有的想法,任何帮助将非常感激

最佳答案

找到了.. 基本上,我们在 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                        
                    }
                }
            };

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

关于asp.net-core - ASP.NET Core 应用程序进入 IdentityServer3 身份验证的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46384082/

相关文章:

c# - 有没有办法制作基础 View 组件 ASP.NET Core?

asp.net-core - 如何安装 asp.net vnext KRuntime 的自定义版本?

c# - 如何将多个 HttpClient 参数传递/注入(inject)到类型化的 HttpClientClass?

c# - EF 核心 SQLException : Cannot insert explicit value for identity column in table 'MenuCategories' when IDENTITY_INSERT is set to OFF

c# - Entity Framework 核心类库构建给出错误 CS7036

c# - 身份服务器 : Login after account activation

amazon-web-services - AWS Cognito JWT 身份验证适用于 ID token ,但不适用于访问 token ?返回 401

c# - 是否可以使用 MailKit 修改/附加邮件而无需下载整个邮件?

asp.net-web-api - 如何保护我的 WebAPI 免受滥用并避免共享 API key ?

javascript - 将 IdentityServer3 与独立 EXE 结合使用(不使用 'redirect_uri' ?)