如何使来自ClaimsPrincipal的FedAuth Cookie不被共享共享域的两个网站共享?

时间:2013-05-07 21:26:29

标签: cross-domain forms-authentication claims-based-identity federated-identity

我有两个网站:

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

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

用户将登录global.domain.com,然后点击指向global.domain.com/site1的链接即可到达。由于我在本文中使用匹配的machineKeys和info:

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

我正在设置一个Forms Auth Cookie,这样就可以让同一个用户在同一个域中的网站之间进行“身份验证”。

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

但是当用户点击或者在/ site1的站点中输入内容时,站点1会获得全局站点的声明,我不希望这种情况发生。

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

FederatedAuthentication.SessionAuthenticationModule.SignOut();

并清除FedAuth cookie。

但是,如果用户只是将/ site1添加到全局网站的URL背面并点击,那么来自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()。声明集合,所有声明都在那里来自全球。

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

是否有人知道在何处及何时分配了ClaimsPrincipal.Current?因为在访问Global.asax中的处理程序之前访问/ site1时它来自全局站点的声明,所以管道中必须有其他地方填充ClaimsPrincipal.Current的声明......

任何想法?

1 个答案:

答案 0 :(得分:0)

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

您的应用程序是否将cookie处理程序路径设置为“/”?如果是,则允许在应用程序之间共享FedAuth cookie。

尝试将Cookie处理程序路径设置为唯一的...例如

<cookieHandler path="/myapplicationpath/" />

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