我的ASP.NET MVC 4应用程序受SSO(OAM)保护,并在IIS上运行ISAPI筛选器。收到对我的应用程序的请求后,它将被ISAPI过滤器拦截并重定向到SSO。用户必须在SSO登录,然后返回我的应用程序。
经过身份验证的用户的用户名(通过SSO)与我在HTTP请求标头中的应用程序共享。
Request.Headers["username"]
我想要实现的目标 - 在SSO身份验证之后,在FormsAuthentication
的应用程序中设置username = Request.Headers["username"]
。这样,SSO对我的应用程序保持透明,用户身份在HttpContext对象中可用,而且,我(开发人员)可以有效地为特定角色使用Authorize属性。
要实现这一目标,我要联系Session_Start()
,阅读Request.Headers["username"]
,设置FormsAuthentication
Cookie。我为我的应用程序提供了这个SSO用户Forms-Authenticated。
但我的问题当我退出(FormsAuthentication.Signout
)时,我将其重定向到应用程序内的另一个页面,这会触发一个新的会话(当发生这种情况时我可以看到Session_Start触发)
我做了正确的事 - 在SSO之后的FormsAuthentication吗?如果没有,为什么不然后如何让我的应用程序知道SSO认证用户?
答案 0 :(得分:1)
使用FormsAuthentication cookie在使用单点登录提供程序进行身份验证后跟踪应用程序中的登录用户是完全合理的。您没有显示它,但我希望您也可以获得一些票证,您可以使用它来验证SSO提供商带外登录的用户,而不仅仅是信任username
标题。 / p>
但是,您可能会看到,当您从应用程序中签名时,用户未从SSO提供商退出。因此,只要他们拥有SSO提供商的有效cookie,他们将保持登录状态,即用户将自动从SSO提供商退回到您的应用程序,而无需任何必要的身份验证。
这很不幸,但很正常。
如果您真的希望用户退出,则需要使用集中注销功能。我没有与OAM合作过,但看起来确实支持OAM:http://docs.oracle.com/cd/E21764_01/doc.1111/e15478/logout.htm
答案 1 :(得分:0)
如果请求的URL是注销URL ,我必须显式地终止Session_Start 中的会话。然后使用下一个请求(例如再次从注销到登录页面),它会生成一个新会话并顺利运行。
protected void Session_Start()
{
if (!Request.IsAuthenticated && !IsSignoutURL)
AcceptSessionRequest(); //process local authentication
else if (IsSignoutURL)
RejectSessionRequest(); //kill the sessions
}
有关SSO如何将经过身份验证的用户身份传递给我的应用程序的背景知识,请阅读我对tvanfosson帖子的评论。
该帖子仍然有效,以便提供更好的建议。