我使用IdentityServer3为SSO设置了几个测试站点,几乎是那些具有轻微virations的cookie切割器示例应用程序。除了一件事之外,它们运行良好:当尝试通过cookie单点登录和/或更新声明时,它仅在所有应用程序位于同一台计算机上时才有效。
例如,这两个应用可以单点注销。
http://localhost:81
http://localhost:82
使用以下内容在一个应用中更新的声明也显示在另一个应用中。
var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
authenticationManager.AuthenticationResponseGrant =
new AuthenticationResponseGrant(new ClaimsPrincipal(identity),
new AuthenticationProperties { IsPersistent = false });
如果我配置这样的应用程序也可以:
http://mymachine/app1
http://mymachine/app2
但如果我混合两个
http://localhost:81
http://mymachine/app2
然后它将无法正常工作。尝试过SignOut / SignIn,结果相同。他们仍然单点登录,但不能一起签出。索赔的变更不会在另一方中显示。当然,如果我将应用程序部署到不同的服务器,也是如此。好像cookie更新发生在本地机器上,而不是发生在IdSvr上。
任何提示我错过了什么?感谢。
答案 0 :(得分:2)
单一注销无法开箱即用,不幸的是,您在同一个域中看到的行为有点像红鲱鱼。
开箱即用,当您注销IdentityServer时,您的客户端应用程序只有在向IdentityServer发出新请求后才能找到并注销自己(可能是他们自己的应用程序cookie已过期并且他们重新登录,或者也许他们试图请求令牌。
要实现单点注销,每个客户端应用程序都需要让IdentityServer告知他们需要注销。这可以使用front-channel HTTP request或session management完成。
查看IdentityServer Signout Support文档,了解有关如何执行此操作的详细信息,或查看有关该主题的Brock Allen's post。