我们使用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例程中使用了一段代码,可以正确清除会话?
由于
答案 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();
}
});
}