【问题标题】:Unable to invalidate Asp.Net Session during IdP initiated Single LogOut with WSO2在 IdP 使用 WSO2 发起单次注销期间无法使 Asp.Net 会话无效
【发布时间】: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


    【解决方案1】:

    调用 FormsAuthentication.SignOut 应该清除身份验证 cookie。我建议捕获 HTTP 流并确认身份验证 cookie 是否已被删除。身份验证 cookie 的默认名称是 .ASPXAUTH。或者,它将是您的 web.config 部分中指定的名称。例如,forms name="mycookie" 会将 cookie 重命名为 mycookie。您不必删除 ASP.NET_SessionId 会话 ID cookie。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多