Microsoft SSO OpenID - 强制注销

Microsoft SSO OpenID - Force a signout

目前正在将遗留 MVC.NET v3 应用程序升级到 v5,同时从 Forms Authentication 切换到 Microsoft 的 SSO 解决方案。我们想要延续的要求是,如果用户闲置 30 分钟就强制注销,就像银行应用程序一样,因为应用程序中会显示机密信息。我们已经在遗留应用程序中成功实现了这一点,但我在注销机制方面遇到了问题。

public void SignOut()
{
    HttpContext.GetOwinContext().Authentication.SignOut(
            OpenIdConnectAuthenticationDefaults.AuthenticationType,
            CookieAuthenticationDefaults.AuthenticationType);
}

当用户单击注销按钮时,无需更改任何内容 - 它会将他们重定向到 Microsoft 的帐户选择器以选择要注销的帐户 - 即使只有一个选择。但是,如果用户单击后退按钮,则他们将返回到应用程序中,这样授权用户就可以看到机密信息。我需要强制注销当前帐户以防止出现这种情况,但我不知道该怎么做。

我试过了:

  1. 正在清除 cookie。失败,因为如果坏人再次点击登录,当前会话会记住他并自动将他们重新登录。
  2. 覆盖 HttpContext.User - 看起来可行。但再次点击登录将自动刷新旧会话,因为令牌提供者会记住状态。

我该如何完成?

谢谢,

我发现这个 link 允许使用 OWIN 的会话变量:

您需要查看此 link 以允许系统网络 cookie 与 OWIN 一起使用: ASP.NET_SessionId + OWIN Cookies do not send to browser

我创建了另一种将用户注销并创建会话变量的方法。

public void ForceSignOut()
{
    SignOut();

    HttpContext.Session.Add("IsSignoutRequested", true);
}

如果用户单击后退按钮并返回到应用程序,我会强制将他们重定向回挑战。

在我的启动 class 中,我设置了 PostLogoutRedirectUri 这让我可以在成功注销时创建另一种方法,从而放弃会话。

public ActionResult CompleteSignOut()
{
    Session.Abandon();
    Request.GetOwinContext().Authentication.SignOut();
    Request.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
    this.HttpContext.GetOwinContext().Authentication.SignOut(CookieAuthenticationDefaults.AuthenticationType);

    return new RedirectToRouteResult(new RouteValueDictionary(new
    {
        controller = "User",
        action = "Index"
    }));
}