使用WSFederationAuthenticationModule时,如何在会话到期后正确处理注销请求?

时间:2014-02-28 15:01:56

标签: asp.net-mvc asp.net-web-api session-timeout adfs ws-federation

我正在使用WSFederationAuthenticationModule进行身份验证。未对用户进行身份验证时,会将其重定向到ADFS Web代理。 ADFS cookie的持续时间比应用程序会话长,因此有时它们只会循环回应用程序。

几乎每次这都是我想要的,用户会尝试做某事,如果会话过期它会重新定向它们(它们再次登录后或者在发现cookie仍然很好之后)然后他们可以做他们想做的事。但是,如果他们点击'退出',我希望他们退出。但是模块正在拦截并将它们发送回来,然后他们必须在会话恢复后再次点击“注销”。

Logout是一个MVC api控制器动作。我不确定是否要从安全性后面取出它,因为它还会触发应用程序的一些清理工作(我意识到这也是一个问题,因为如果它们永远不会点击注销那些事情不会发生但是那个是一个不同的问题)。

我觉得我必须错过WSFederationAuthenticationModule和ADFS的某些东西...对于使注销操作成为匿名/公共操作感觉不对。在WSFederationAuthenticationModule的意图中必须考虑到这一点,但我似乎无法确定它。

1 个答案:

答案 0 :(得分:0)

据我所知,您的身份验证是通过Auth cookie保存的。您应该尝试在注销操作下在应用控制器中添加以下内容:

     FederatedAuthentication.SessionAuthenticationModule.SignOut();
     return View("LogOut");

这会将它们记录下来。现在,如果未经身份验证的人无法访问“LogOut”视图,它将重定向回您的登录页面进行登录。 还有一件事,如果您的意思是在会话到期后,当有人试图访问注销页面时(虽然他们的会话无论如何已经过期),他们会首先被重定向到登录模块进行身份验证(因为他们需要进行身份验证)访问注销页面),你可以做这样的事情:

     if (User.Identity.IsAuthenticated)
         ...u'r logout logic goes here together with other clean-up...
     else
         ...u could choose to return a view which says he is already logged out

或在登录服务端(如果您控制它)检查请求来自何处并采取相应措施。