1

我有两个网站:

global.domain.com 和 global.domain.com/site1

/site one 是在 global.domain.com 的站点下添加到 IIS 的应用程序。

用户将登录 global.domain.com,然后单击指向 global.domain.com/site1 的链接以到达那里。由于我使用的是匹配的 machineKey,以及本文中的信息:

http://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx

我正在设置一个 Forms Auth cookie,这允许单个用户在同一域的站点之间进行“身份验证”。

我还在每个站点中使用 ClaimsPrincipal 通过 .NET 4.5 中的新声明处理角色分配。

但是,当用户单击或输入 /site1 的站点时,site1 正在获取全局站点的声明,我不希望这种情况发生。

如果我有从全局站点到 /site1 的直接链接,我可以在调用后使用控制器操作来重定向用户:

FederatedAuthentication.SessionAuthenticationModule.SignOut();

这会清除 FedAuth cookie。

但是,如果用户只是将 /site1 添加到全局站点 URL 的后面并点击 go,那么来自 Global 的声明将传送到 /site1 的声明中。

每个站点都应该有自己的声明...

我尝试在 Global.asax 的 PostAuthenticate 处理程序中删除 FedAuth cookie:

 protected void Application_PostAuthenticateRequest()
 {
        if (HttpContext.Current.Request.UrlReferrer == null)
        {
            FederatedAuthentication.SessionAuthenticationModule.SignOut();
            HttpContext.Current.Request.Cookies.Remove("FedAuth");
            return;
        }
 }

但这似乎不起作用,b/c 如果我在 Application_PostAuthenticateRequest 的第一行打断并查看 ClaimsPrincipal.Current.Identities.First().Claims 集合,所有声明都来自全局。

所以即使我调用 SessionAuthenticationModule.SignOut(); 并删除 FedAuth cookie,我仍然必须找到一种方法从 ClaimsPrincipal.Current 中删除声明,这似乎有点“骇人听闻”。

有谁知道 ClaimsPrincipal.Current 在何时何地被分配?由于它在访问 /site1 之前在 Global.asax 中访问我的处理程序之前从全局站点获得了我的声明,因此管道中必须有其他地方正在填充 ClaimsPrincipal.Current 的声明...

有任何想法吗?

4

1 回答 1

0

要防止 FedAuth cookie 跨同一域中的应用程序工作,请为每个应用程序配置一个具有唯一路径的 cookie 处理程序。

您的应用程序是否将 cookie 处理程序路径设置为 "/" ?如果是,那么这就允许在应用程序之间共享 FedAuth cookie。

尝试将 cookie 处理程序路径设置为独特的东西......比如

<cookieHandler path="/myapplicationpath/" />

或 - 完全排除路径属性应该完成同样的事情。

于 2016-12-15T21:25:06.823 回答