Owin 身份验证单点退出

Owin Authentication Single Sign-Out

我有一个用于单点登录的自定义身份验证中间件。我想知道我应该如何实施单点退出解决方案。

我需要调用 Authentication.Signout() 来注销我的应用程序,但随后我需要将用户重定向到我们自定义 STS 的注销端点。我应该在哪里处理这个? InvokeApplyResponseGrant?根本不在处理程序中,而只是手动重定向?

编辑: 这是一个 MVC 应用程序。除了将本地注销链接到注销 STS 之外,我一切正常。在此处添加我现有的代码只会混淆我的问题,IMO。如果有一段特定的代码可以提供帮助,请告诉我,我会添加它。

理想情况下,我想要某种事件或标志告诉我用户正在注销,然后将响应更改为对外部注销的 302。如果我将此代码放在 ApplyResponseGrant 中,我感觉它会阻止 CookieAuthentication 中间件清除身份验证 cookie。如果我将此代码放在注销控制器操作中(在调用 Authentication.SignOut() 之后),那么我将其留给每个应用程序来处理单点注销。

我成功了。这是我所做的。

在我的 AccountController 中,我添加了 Logout 操作 returns Redirect("/signout-custom")

在我的 OWIN 处理程序中,我在 Invoke 方法中观察 URL,调用我的远程注销端点、本地注销方法,并停止 OWIN 处理。

public override async Task<bool> InvokeAsync() {
    //other code

    if (Request.Path == Options.LogoutCallbackPath) {
        Context.Authentication.SignOut(Options.AuthenticationType);
        Response.Redirect(WebUtilities.AddQueryString(Options.ClauthLogoutUri, "returnUrl", "http://localhost:62506/Home/About"));
        return true;
    }

    //other code

}

重定向不会中断 OWIN 流程,因此 CookieAuthentication 中间件仍会运行并清除本地身份验证 cookie。