1

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

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

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

我觉得我必须在 WSFederationAuthenticationModule 和 ADFS 中遗漏一些东西......将注销操作设为匿名/公共操作感觉有些不对劲。在 WSFederationAuthenticationModule 的意图中必须对此进行一些考虑,但我似乎无法确定它。

4

1 回答 1

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

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

于 2014-02-28T15:20:58.160 回答