背景
我们有ASP.Net核心应用程序,已生产最近1年。最近我们将我们的应用程序从VS 2015转换为VS 2017.所以我们从基于json的项目转移到基于csproj的项目。我们还升级了.NET Core runtime framework to 1.1.2
。
应用程序使用集中IdentityServer3
进行身份验证,使用OpenIDConnect。
转换后,我们将应用程序发布到我们的开发服务器。该应用程序托管在IIS下。所以我们在开发服务器上安装了以下内容:
在开发服务器上一切都很顺利,我们测试了应用程序没有任何问题。
然后我们在生产服务器上安装相同的.Net Core framework 1.1.2和Windows Server Hosting。并将相同的已发布文件夹从开发服务器复制到生产服务器,并相应地更新appsettings.json
问题
在我们登录时的生产中,身份服务器进入无限循环的身份验证。 Fiddler展示了从identityServer到网站的几次往返旅行。每次往返都会将.AspNetCore.OpenIdConnect.Nonce
和.AspNetCore.Correlation.oidc
添加到Cookie中,最终由于最大请求大小而导致错误的请求错误。
有几个帖子(here here,here,here)与同一问题相关。解决方案是将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
所以我猜测以下可能是错误的:
<TargetFramework>netcoreapp1.1</TargetFramework>
但我怎么知道
发布的代码使用的版本)4.7
,并且生产安装了经典的.NET Framework 4.6.2
。但是我认为这不应该导致问题因为应用程序是ASP.NET核心应用程序而不是经典的.NET Framework应用程序我对所有想法都很累,任何帮助都会非常感激
答案 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。