0

注意我没有使用 .Net Core。我有一个 ASP.Net MVC 应用程序,它使用 Azure AD 或 ADFS 保护,具体取决于客户。它有几个用于管理或生成文档的其他独立 MVC 应用程序,以及用于管理管理设置的旧版 ASP.Net 应用程序。使用基于声明的 OpenID 连接的单点登录运行良好。但是,如果我退出主应用程序,如果它们在其他选项卡中打开,我仍然可以刷新或使用其他应用程序。我还可以打开其他选项卡并直接进入这些应用程序而不会受到挑战。

当主应用程序按下其注销按钮时,代码会尝试调用其他应用程序的注销 url。第一个 MVC 应用程序 (App_A) 执行:

Session?.Abandon();
Request.GetOwinContext().Authentication.SignOut();

这执行得很好,但是当下一个 Asp.NET 应用程序 (App_B) 尝试执行相同操作时,它会出现 CORS 错误并且调用不成功。我无法再进入 App_A 但 App_B 仍然可以访问。如果我删除 App_A 的 Signout() 调用,则 App_B 的注销运行正常,但我仍然可以在注销后进入两个应用程序,但不能进入主应用程序。我已经尝试过

  • Session.Abandon(),
  • 清除所有 cookie 或将其设置为过期,
  • SessionAuthenticationModule.DeleteSessionCookie(),
  • 使用所有可用的 DefaultAuthenticationTypes 调用 SignOut(),
  • 尝试删除那些允许我这样做的声明。

我唯一一次成功是我让它闲置了一段时间,突然所有的应用程序都要求我进行身份验证。我知道这与会话无关,因为我无法使用 iisreset 复制它,所以它必须是 cookie 过期,但我无法确定。当我注销时,cookie 会消失,但一旦我尝试访问其中一个非主要应用程序,它们就会立即弹出。此外,如果我没有首先访问其中一个应用程序并将其称为注销 url,我会收到 CORS 错误,由于某种原因阻止了请求。

我正在寻找有关如何使用 OpenID Connect(不是 SAML)退出多个站点(Asp.NET 和 Asp.NET MVC,而不是 Core )的任何指南或指导。

4

0 回答 0