我们公司使用ASP.NET webapp,我必须与外部身份提供商集成。为此,在某些情况下,认证流量被重定向到处理程序,该处理程序引用一些外部库来解释来自身份提供者的认证请求。
因此,在处理程序代码应该用于与身份提供者进行通信的情况下,在Global Application_BeginRequest中进行重定向。有点像这样:
Response.Redirect(tempUrl & "/auth/" & companyName & "/login.ashx")
问题是会话状态在根Web.Config中设置为cookieless,如下所示:
<sessionState mode="InProc" [snip] cookieless="true" />
这意味着重定向本身会被捕获并重新定向,会话ID前缀为。从login.ashx处理程序中,请求被发送到外部身份提供者的URL,该URL对其进行身份验证并将其作为POST发送回同一个处理程序URL,即&#34; http://www.thesite.com/auth/somecompany/login.ahsx&#34;但是,这次没有会话ID,当然。因此,POST再次被重定向为GET,从表单数据中剥离响应,因此无法继续进行身份验证。然后,该请求将在无限循环中重定向回身份提供程序。
因此,我们需要为特定处理程序关闭cookieless sessionstate。我们调查了几个选项。
首先,不幸的是,EnableSessionState属性不能用于处理程序页面指令。
然后,我们尝试通过在Global.asax.Application_BeginRequest中捕获并禁用它来将请求的sessionstate行为更改为特定URL,如下所示:
HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Disabled)
这似乎在一个阶段起作用,但现在不再存在,我们不确定原因。
我们还试图了解&#34; cookieless&#34;可以动态更改,但相应的字段似乎是只读的。
我们在&#34; auth&#34;中添加了单独的Web.config。文件夹并尝试将cookieless设置为true,但这是不允许的。
我们可以捕获响应并查看是否在Application_EndRequest中重定向,并且想知道是否可以以某种方式阻止重定向和会话ID插入特定URL,但我们不确定如何。有没有人有一些提示?我们的想法已经不多了......
答案 0 :(得分:0)
我们通过将有问题的子文件夹转换为IIS中的虚拟应用程序并为其分配自己的Web.Config来解决问题,其中可以关闭cookieless。