ADFS3 -> IdentityServer3 Выход из проверяющей стороны

У нас есть identityServer3, связанный как проверяющая сторона с ADFS3 с помощью WSFed. Логин работает нормально. Пытаюсь реализовать logout. Добавлена ​​конечная точка в IDServer, как указано здесь >https://leastprivacy.com/2015/07/08/federated-logout-with-the-katana-ws-federation-middleware/ однако это не работает, потому что не выходит из 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 =выйти. Я предполагаю, что что-то делается при выходе из системы перед вызовом endsession?

Как только это заработает, я надеюсь, что наше javascript-приложение openID/oauth обнаружит, что сеанс пользователя изменился с помощью конечной точки checksession. Кажется, что изменения улавливаются при двойном вызове выхода из системы...

Есть ли у кого-нибудь фрагмент кода, который мы можем использовать в подпрограмме wsignoutcleanup на IDserver, чтобы правильно очистить сеанс?

Спасибо


person Andy    schedule 08.08.2016    source источник
comment
Хорошо, поэтому, поработав еще немного и сравнив, как Iframe выходит из системы на других сайтах, которые работают, я думаю, что это X-Frame-Options: SAMEORIGIN, который останавливает обновление файлов cookie. Поэтому я думаю, что мне нужно отключить добавление опций x-frame для выхода из системы, тогда, надеюсь, файлы cookie будут удалены, и это должно работать. Любые идеи о том, как остановить добавление параметров x-frame в ответ на выход из системы?   -  person Andy    schedule 12.08.2016
comment
Еще один шаг ближе .... Итак, теперь он выходит из системы, когда я вызываю //idserver/logout в первый раз, я сделал мой wsignoutcleanup очистить куки idsvr, idsvr.partial, idsvr.external, а затем перенаправить на / /idсервер/endsession. Чего мне не удалось сделать, так это заставить работать выход из системы при переходе к //adfs/wsignout, файлы cookie теперь установлены нормально, но idserver, похоже, все еще думает, что он вошел в систему.   -  person Andy    schedule 12.08.2016
comment
Наконец-то он работает!! Оказывается, файл cookie idsvr - это не idsvr, а idsrv doh! .. Итак, idserver/logout работал, потому что он очищал файлы cookie, а затем перенаправлял на adfs/singout, который выполнял iframe для idsvr/wsignoutcleanup, который перенаправляет на idsvr/endsession. Теперь я устанавливаю те же куки пустыми в idsvr/wsignoutcleanup, это работает в обоих направлениях.   -  person Andy    schedule 12.08.2016


Ответы (1)


Поэтому я подумал, что опубликую код, который работает, не уверен, что мне нужно вызывать выход, но, похоже, все работает, может помочь кому-то другому.....

    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();
            }
        });
    }
person Andy    schedule 12.08.2016