2008-11-03 36 views
2

我们有一个使用集中式验证服务器(CAS)进行单点登录的应用程序。我们希望进行单点登录,例如,如果用户从一个应用程序(例如前端门户)注销,用户将自动使用同一单点登录票签出所有应用程序。我是否可以从发出请求的会话中放弃InProc ASP.NET会话?

期望的是每个应用程序在登录到该应用程序时都会注册一个带有CAS的注销挂钩(URL)。当CAS从其中一个应用程序收到注销请求时,它会为共享SSO票证的所有应用程序调用注销挂钩。

我的问题是:有没有办法从一个不同的会话中放弃一个InProc会话?我认为,由于HTTP请求将来自CAS服务器,它将获得它自己的会话,但它是我想要终止的用户会话。我非常清楚如何使用单独的会话状态服务器来完成此操作,但是我想知道是否可以使用InProc会话状态。

回答

2

在做了一些挖掘并考虑到目前为止提供的答案之后,我想出了一个让我继续使用InProc会话的替代方案。基本上,它包括将已经处理单点登录的HttpModule扩展到检测到的CAS签名并将浏览器重定向到应用程序注销页面。

大纲:

登录:

  1. 对于每一个新的单点登录请求,创建一个新的SSO cookie,并编码独特的价值在它标识会话(而不是会话ID ,所以不会泄露)。
  2. 构建注销回调URL,使用标识符进行编码,并将其注册到CAS服务器。

登出:

  1. 当从CAS服务器接收的签出请求,解码所述标识符并将其存储在一个应用范围的高速缓存。这需要在缓存中固定至少足够长的时间,以使会话自然过期。
  2. 对于每个请求,查找SSO cookie并根据缓存的注销会话标识符检查其值。如果遇到问题,请移除SSO Cookie并将浏览器重定向至应用程序的注销网址。
  3. 对于每次注销,请检查是否有SSO cookie,如果是,请将注销请求转发给CAS。无论如何,放弃用户的会话,并将其签出应用程序。

的Page_Load:

  1. 检查的SSO cookie的存在。如果没有,则重定向到注销页面。
1

随着SessionState的是InProc,您将无法访问数据...随着StateServer的,你仍然有粘性的场景试图访问正确的API来拆除会话。

您很可能希望使用像预打包的SqlServer状态提供商或第三方解决方案像DOTSS数据库支持国家的解决方案:http://codeplex.com/dotss

与数据库备份解决方案,您将能够来查找按会话ID在表中记录状态记录并将其标记为已完成。这些技术将根据您选择的提供商而有所不同。

3

哈哈,好吧......看起来你可以。我在想自己是否有办法做到这一点,事实证明,有。

当您使用InProc时,InProcSessionStateStore(内部类)会将会话状态保留在内部(非公用)缓存中。您可以通过反射访问此缓存并手动删除会话状态。

using System; 
using System.Reflection; 
using System.Web; 

object obj = typeof(HttpRuntime).GetProperty("CacheInternal", 
    BindingFlags.NonPublic | BindingFlags.Static) 
     .GetValue(null, null); 

if (obj != null) 
{ 
    MethodInfo remove = obj.GetType() 
     .GetMethod("Remove", BindingFlags.NonPublic | BindingFlags.Instance, 
      Type.DefaultBinder, new Type[] { typeof(string) }, null); 

    object proc = remove.Invoke(obj, new object[] { "j" + state.SessionID }); 
} 

最终的结果是,下一个请求将在相同的SessionID,但HttpSessionState将是空的。你仍然会得到Session_Start和Session_End事件。

+0

这会议状态的工作不会存储在过程?如果不是,对于非InProc场景,最好的方法是做什么? – 2014-02-13 14:11:40

相关问题