我有两个网站:
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的声明......
任何想法?
答案 0 :(得分:0)
为防止FedAuth cookie在同一域中的应用程序之间工作,请为每个应用程序配置一个具有唯一路径的cookie处理程序。
您的应用程序是否将cookie处理程序路径设置为“/”?如果是,则允许在应用程序之间共享FedAuth cookie。
尝试将Cookie处理程序路径设置为唯一的...例如
<cookieHandler path="/myapplicationpath/" />
或 - 完全离开路径属性应该完成同样的事情。