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
应用程序正在使用centralizeIdentityServer 3
进行使用OpenIDConnect的身份验证
转换后,我们将应用程序发布到开发服务器。应用程序托管在IIS下。因此,我们在development server上安装了以下组件:
- Microsoft.NET Core 1.1.2–运行时(x64)
- Microsoft.NET Core 1.0.5& 1.1.2–Windows服务器托管
在产品中,当我们登录时,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
因此,我猜测以下可能是错误的:
netcoreapp1.1
但我怎么知道
发布的代码正在使用的版本)4.7
,生产服务器安装了classic.NET Framework4.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
}
}
};
我们修复了数据库连接问题,然后一切正常