使用OpenIDConnect和SESSION[]变量的ASP.NET框架v4应用程序不会对第二个会话进行身份验证

人气:725 发布:2022-10-16 标签: session asp.net asp.net-mvc c# openid-connect

问题描述

我有一个.NET Famework 4.7.1 ASP.NET/MVC应用程序,我正在将其从SAML切换到新的OpenIDConnect身份提供程序。原始代码使用来自SAML提供程序的库,并使用Framework4.5。我升级到了4.7.1并添加了owin。

在我将该应用程序投入生产之前,一切似乎都运行得很好。那时,只有第一个登录的人才能进入。任何其他启动新会话的人都会被困在站点和IP之间的重定向循环中,直到随机数cookie填满请求并收到"请求太长"错误。

我已经使用此IP和ASP.NET框架设置了其他应用程序,并且我没有问题。此应用程序是Framework4.5,但从一开始就设计为使用OWIN和Kentor.AuthServicesfor SAML,并且向OpenIDConnect的转换非常顺利。

我和我的IP的支持关注了我的应用程序和IP之间的对话,令牌被正确地发回了。我在身份验证中添加了通知,并设置了断点。应用程序正在获取令牌并对其进行验证。

我尝试返回到Framework4.5,并将所有库设置为与其他正在运行的应用程序相同的版本。这不管用。

我最终找到了使用SESSION[]变量的原因。我还能够使用新的.NET ASP.NET应用程序重现此问题。

创建不带身份验证的新"ASP.NET Web应用程序"框架4.7.1。(您可以从他们的身份验证开始,但无济于事) 安装NuGet包"Microsoft.Owin.Host.SystemWeb"(v4.0.0.0) 安装NuGet包"Microsoft.Owin.Security.OpenIdConnect"(v4.0.0.0) 安装NuGet包"Microsoft.Owin.Security.Cookies"(v4.0.0.0)

创建Startup.cs

使用Microsoft.Owin; 使用OWIN; 使用制度; 使用Microsoft.Owin.Security.Cookies; 使用System.Configuration; 使用系统.Collections.Specialized; 使用Microsoft.Owin.Security.OpenIdConnect; 使用Microsoft.IdentityModel.Protocols.OpenIdConnect; 使用Microsoft.Owin.Security; [组件:OwinStartupAttribute(typeof(WebApplication.Startup))] 命名空间WebApplication { 公共部分类启动 { 公共无效配置(IAppBuilder应用程序) { App.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

       app.UseCookieAuthentication(new CookieAuthenticationOptions{});
       app.UseOpenIdConnectAuthentication(
           new OpenIdConnectAuthenticationOptions
           {
               ClientId = "{clientid}",
               Authority = "{IP authority}",
               ResponseType = OpenIdConnectResponseType.CodeIdTokenToken,
               Scope = OpenIdConnectScope.OpenIdProfile + " " + OpenIdConnectScope.Email,
           });

       }
   }

}

修改HomeController.cs

公共类HomeController:控制器 { 公共动作结果索引() { 返回视图(); )

   public ActionResult About()
   {

       ViewBag.Message = "Your application description page.";

       // Added this line ****************
       Session["Value"] = "Test Value";

       return View();
   }

   // Added this line ****
   [Authorize] 
   public ActionResult Contact()
   {
       ViewBag.Message = "Your contact page.";

       return View();
   }

}

要显示问题,请执行以下步骤

运行Web应用程序并转到联系人页面。您要么已经通过身份验证,要么需要登录。 打开另一个浏览器或私人/隐姓埋名页面,以便获得新会话并打开站点。转到联系人页面。您需要重新登录。

您可以看到身份验证对两个会话都有效。

关闭第二个浏览器/私人/匿名窗口。 返回到第一个浏览器并转到"关于"页。这是具有Session[]赋值的页面 打开新的浏览器/私人/匿名窗口。返回到站点上的联系人页面。系统将再次要求您进行身份验证。

在您进行身份验证后,浏览器将开始站点和您的IP身份验证之间的重定向循环。

无论[Authorize]属性在控制器上还是在操作上都无关紧要。 OpenIdConnect选项中是否分配了客户端机密并不重要。 我向另一个正在运行的应用程序添加了一个SESSION[]变量,但它开始出现相同的问题。

除了删除所有会话[]变量之外,是否可以执行其他操作来停止此行为?

我知道这是一篇很长的文章。感谢你从头到尾阅读和 感谢您的帮助。

推荐答案

一位同事发现了此帖子。

ASP.NET_SessionId + OWIN Cookies do not send to browser

有几个关于备用Cookie管理器的答案。来自Anders Abel的post在我的测试应用程序中工作。我将在那里探索更多的答案。

1,000