【发布时间】:2021-05-08 21:14:12
【问题描述】:
我们正在使用 WSO2 身份服务器实施单点登录流程。我们同时涉及 Microsoft 和 Java Web 应用程序,并且在使用基于 Microsoft 的 Web 应用程序进行单次注销处理期间遇到问题。该问题与身份提供者发起的 SLO 上的会话失效有关。
这是场景:
- 配置了单个身份提供程序的 WSO2 身份服务器
- 一个 Asp.Net MVC 应用程序,使用 ComponentSpace SAML2 程序集和带有 [Authorize] 属性的表单身份验证标记控制器,以确保用户通过身份验证访问它们。
- WSO2 提供的用于测试 SSO 的 DEMO Java Web 应用程序
登录过程正常。我们从 WSO2 获得一个会话 ID,并且用户在第一个应用程序中通过 WSO2 登录表单进行身份验证,并在第二个应用程序中透明地登录。
在 Asp.Net webapp 中,当成功登录时,我们验证用户以访问 [Authorize] 标记的控制器调用 FormsAuthentication.SetAuthCookie(userName, false); .当用户从其中一个应用程序中注销时,WSO2 会通过配置的 URI 向其他参与者发送 SLO 请求。当 Microsoft 收到此请求时,我们调用 FormsAuthentication.SignOut();方法,但会话没有被破坏。如果用户刷新浏览器页面,其 User.Authenticated 属性仍然为 True,因此他仍然可以访问 [Authorize] 标记的控制器。在我看来这是有道理的,因为调用者是 WSO2 而不是用户浏览器。
我们对 WSO2 为 Java 应用程序提供的 JAR 代码进行了一些调查,它在 Tomcat 上创建了一个过滤器,实现了一个单例,以在每次成功登录操作发生时存储 WSO2 Session ID 与 Session 对象的关系。当 WSO2 请求 SLO 时,过滤器获取 WSO2 会话 ID 作为参数,访问单例 HashTable 以检索会话对象并调用会话对象的 Session.Invalidate() 方法。如果用户刷新浏览器,他会被重定向到登录页面。我们尝试在 Asp.Net 端实现类似的东西,但即使我们在服务器端获取 Session 对象并调用 Session.Abandon() 方法,当用户刷新浏览器时也不会发生任何事情。他仍被标记为已通过身份验证。
我对 Cookie 不是很熟悉,我感觉这与它们有关。
有没有人遇到过类似的问题? 任何意见或建议将不胜感激。
谢谢
【问题讨论】:
标签: asp.net-mvc session authentication wso2is