在SSO身份validation后设置FormsAuthentication

我的ASP.NET MVC 4应用程序受SSO(OAM)保护,并在IIS上运行ISAPI筛选器。 收到对我的应用程序的请求后,它将被ISAPIfilter拦截并重定向到SSO。 用户必须在SSO登录,然后返回我的应用程序。

经过身份validation的用户的用户名(通过SSO)与我在HTTP请求标头中的应用程序共享。

Request.Headers["username"] 

我想要实现的是 – 在SSO身份validation之后,在我的应用程序中为username = Request.Headers["username"]设置FormsAuthentication 。 这样,SSO对我的应用程序保持透明,并且HttpContext对象中提供了用户身份,此外,我(开发人员)可以有效地为特定角色使用Authorize属性。

要实现这一点 – 我连接到Session_Start() ,读取Request.Headers["username"] ,设置FormsAuthentication cookie。 我为我的应用程序获得了这个SSO用户Forms-Authenticated。

但我的问题是当我注销( FormsAuthentication.Signout )时,我将其重定向到应用程序内的另一个页面,这会触发一个新的Session(我发现会发生Session_Start触发)

我做了正确的事 – 在SSO之后的FormsAuthentication吗? 如果没有,为什么不然后如何让我的应用程序知道SSO认证用户?

使用FormsAuthentication cookie在使用Single-Sign-On提供程序进行身份validation后跟踪应用程序中的登录用户是完全合理的。 你没有显示它,但我希望你也得到一些票,你可以使用它来validationSSO提供商带外登录的用户,而不是简单地信任username头。

但是,您可能会看到,当您从应用程序中签名时,用户未从SSO提供商退出。 因此,只要他们拥有SSO提供商的有效cookie,他们将保持登录状态,即用户将自动从SSO提供商退回到您的应用程序,而无需任何必要的身份validation。

这很不幸,但很正常。

如果您真的希望用户注销,则需要使用集中注销function。 我没有和OAM合作过,但看起来确实支持这个: http : //docs.oracle.com/cd/E21764_01/doc.1111/e15478/logout.htm

如果请求的URL是注销URL,我必须显式地终止Session_Start中的会话。 然后使用下一个请求(例如再次从注销到登录页面),它会生成一个新会话并顺利运行。

 protected void Session_Start() { if (!Request.IsAuthenticated && !IsSignoutURL) AcceptSessionRequest(); //process local authentication else if (IsSignoutURL) RejectSessionRequest(); //kill the sessions } 

有关SSO如何将经过身份validation的用户身份传递给我的应用程序的背景知识,请阅读我对tvanfossonpost的评论。

该post仍然开放以获得更好的主意。