ADFS3 - > IdentityServer3依赖方注销

时间:2016-08-08 17:27:16

标签: identityserver3

我们使用WSFed将identityServer3作为ADFS3的依赖方链接。登录工作正常。试图实施注销。在IDServer中添加了一个端点https://leastprivilege.com/2015/07/08/federated-logout-with-the-katana-ws-federation-middleware/,但它没有工作,因为它没有注销IDServer,因为记录了呼叫,所以它被称为OK。

一直在通过直接调用IDServer上的注销进行试验,例如:// idserver /注销。但我必须调用它两次以使注销工作。我第一次调用它时,我被重定向到ADFS注销,我可以看到使用fiddler ADFS有一个iframe回到:// idserver /?wa = wsignoutcleanup所以我认为这只是一个获得正确的代码进入wsignoutcleanup的清理程序。

我发现如果我两次调用注销,那么我尝试在清理函数中重定向到:// idserver / logout。我可以看到使用fiddler页面在iframe中调用但是/ endsession?sid = xxx之后没有被调用,也许是因为它在iframe中是iframe?我也试过重定向到endsession?sid = xxxx。我认为这有效但只有在我打电话给https://idserver/logout时才打电话:// adfs /?wa = signout。我猜在注销endsession之前注销了一些东西吗?

一旦这个工作,我希望我们的openID / oauth javascript应用程序将使用checksession端点获取用户会话已更改。在两次调用注销时似乎确实发现了变化......

是否有人在IDserver上的wsignoutcleanup例程中使用了一段代码,可以正确清除会话?

由于

1 个答案:

答案 0 :(得分:0)

所以我想我会发布有效的代码,不确定我是否需要调用注销但这一切似乎都有用,可能会帮助其他人......

    private static void AddSignoutEndpoint(IAppBuilder app)
    {
        app.Use(async (ctx, next) =>
        {
            var qs = ctx.Request.Query;
            var wa = qs.Get("wa");

            if (wa != null)
            {
                if (wa == "wsignoutcleanup1.0")
                {
                    ctx.Response.Cookies.Delete("idsrv");
                    ctx.Response.Cookies.Delete("idsrv.external");
                    ctx.Response.Cookies.Delete("idsrv.partial");
                    ctx.Authentication.SignOut("Cookies");
                    ctx.Response.Redirect("connect/endsessioncallback?sid=" + ctx.Request.Cookies["idsvr.session"]);
                }
                else
                {
                    await next();
                }
            }
            else
            {
                await next();
            }
        });
    }