背景
我们有 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 here 、 here 、 here )与同一问题相关。解决方案是将 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
的开发服务器上工作。
所以我猜测以下可能是错误的:
- 我可能忘记在生产服务器上安装某些东西( 确保我已经安装了 .NET Core 1.1.2 运行时和 Windows Server 托管,我不确定在生产中还需要安装什么)
- 我可能没有正确配置 IIS(但是什么?)
- 在生产服务器上我如何知道应用程序处于什么版本
正在运行。 (在 Visual Studio 中的 .csproj 中
<TargetFramework>netcoreapp1.1</TargetFramework>
但我怎么知道 发布的代码使用的是什么版本) - 开发服务器和生产服务器之间的唯一区别是,开发服务器具有经典的.NET Framework
4.7
安装和生产具有经典的.NET Framework4.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/