2016-08-08 41 views
0

Wir haben identityServer3 als vertrauende Seite für ADFS3 mit WSFed verknüpft. Login funktioniert gut. Versuchen, Abmeldung zu implementieren. Fügen Sie einen Endpunkt in IDServer wie hier angegeben hinzu https://leastprivilege.com/2015/07/08/federated-logout-with-the-katana-ws-federation-middleware/ aber es funktioniert nicht, dass es IDServer nicht abmeldet, es heißt OK, wie den Anruf protokolliert haben.ADFS3 -> IdentityServer3 Abmeldung der vertrauenden Seite

Experimentieren Sie, indem Sie das Abmelden auf dem IDServer direkt aufrufen, z. : // idserver/abmelden. Aber ich muss es zweimal anrufen, um das Abmelden zu starten. Das erste Mal, wenn ich es anrufe, werde ich zum ADFS - Logout weitergeleitet, ich kann mit fiddler ADFS sehen, dass ein iframe zurück zu: // idserver /? Wa = wsignoutcleanup kommt, also denke ich, es ist nur ein Fall, den richtigen Code in die Aufräumroutine für wsignoutcleanup.

Ich fand, wenn ich das Abmelden zweimal angerufen habe, funktionierte es, also versuchte ich, eine Umleitung zu zu machen: // idserver/logout in der Säuberungsfunktion. Ich kann sehen, mit fiddler die Seite in einem iframe aufgerufen wird, aber/endsession? Sid = xxx wird dann nicht aufgerufen, vielleicht weil es ein iframe in einem iframe? Ich habe auch versucht, zu endsession umzuleiten? Sid = xxxx. Ich denke das funktioniert aber nur wenn ich https://idserver/logout nicht anrufe wenn ich anrufe: // adfs /? Wa = signout. Ich nehme an, dass beim Abmelden etwas unternommen wird, bevor Endsession angerufen wird?

Sobald dies funktioniert hoffe ich, dass unsere openID/OAUTH Javascript-App erkennen wird, dass sich die Benutzersitzung mit dem Checksession-Endpunkt geändert hat. Es scheint die Änderung abzuholen, wenn Sie zweimal ausloggen ...

Hat jemand ein Code-Schnipsel, das wir in der Routine wsignoutcleanup auf IDserver verwenden können, die die Sitzung ordnungsgemäß löscht? So

Dank

+0

OK , also fummeln und vergleichen, wie Iframes sich bei anderen Seiten abmeldet, die funktionieren. Ich denke, dass "X-Frame-Optionen: SAMEORIGIN" die Aktualisierung der Cookies verhindert. Also ich denke, ich muss das Hinzufügen der X-Frame-Optionen für die Abmeldung deaktivieren, dann werden hoffentlich die Cookies ausgeblendet und es sollte funktionieren. Irgendwelche Ideen, wie man die X-Frame-Optionen, die zur Abmeldeantwort hinzugefügt werden, stoppt? – Andy

+0

Ein weiterer Schritt näher .... Also ich habe es jetzt, dass es sich abmeldet, wenn ich // idserver/logout das erste Mal anrufe, habe ich meine wsignoutcleanup sauber gemacht, idsvr, idsvr.partial, idsvr.external cookies und dann umgeleitet auf // ID-Server/Endsession. Was ich nicht geschafft habe, ist das Abmelden, wenn ich zu // adfs/wsignout gehe. Die Cookies sind jetzt in Ordnung, aber der idserver scheint immer noch daran zu denken, dass er eingeloggt ist. – Andy

+0

Es funktioniert endlich !! Stellt sich heraus das Idsvr Cookie ist nicht idsvr aber IDSRV Doh! .. So funktioniert IDServer/Logout cos es bereinigt die Cookies dann umgeleitet zu adfs/sinout, die einen iframe zu IDsvr/wsignoutcleanup, die zu IDsvr/endsession umgeleitet hat. Jetzt setze ich dieselben Plätzchen, um in idsvr/wsignoutcleanup zu löschen, das in beide Richtungen funktioniert. – Andy

Antwort

0

dachte, ich würde nach dem Code, der funktioniert, nicht sicher, ob ich brauche signout zu nennen, aber es scheint alles zu funktionieren könnte sonst jemand helfen .....

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(); 
      } 
     }); 
    }