我有两个网站:
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 的声明...
有任何想法吗?