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

ASP.NET Framework v4 App using OpenIDConnect and Session[] variables will not authenticate the second session(使用OpenIDConnect和SESSION[]变量的ASP.NET框架v4应用程序不会对第二个会话进行身份验证)
本文介绍了使用OpenIDConnect和SESSION[]变量的ASP.NET框架v4应用程序不会对第二个会话进行身份验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个.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应用程序重现此问题。

  1. 创建不带身份验证的新"ASP.NET Web应用程序"框架4.7.1。(您可以从他们的身份验证开始,但无济于事)
  2. 安装NuGet包"Microsoft.Owin.Host.SystemWeb"(v4.0.0.0)
  3. 安装NuGet包"Microsoft.Owin.Security.OpenIdConnect"(v4.0.0.0)
  4. 安装NuGet包"Microsoft.Owin.Security.Cookies"(v4.0.0.0)
  5. 创建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,
               });
    
           }
       }
    

    }

  6. 修改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();
       }
    

    }

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

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

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

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

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

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

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

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

推荐答案

一位同事发现了此帖子。

ASP.NET_SessionId + OWIN Cookies do not send to browser

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

这篇关于使用OpenIDConnect和SESSION[]变量的ASP.NET框架v4应用程序不会对第二个会话进行身份验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)