1

我有兩個網站:如何讓ClaimsPrincipal的FedAuth Cookie在共享公共域的兩個網站之間共享?

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

/網站一個是應用程序被添加global.domain.com的網站下IIS。

用戶將登錄到global.domain.com,然後單擊到global.domain.com/site1的鏈接即可到達該位置。由於我使用的MachineKeys的匹配,而信息在這篇文章中:

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

我設置一個窗體身份驗證cookie的,而這允許單個用戶進行「認證」在同樣的域名網站之間。

我還在每個站點使用ClaimsPrincipal來處理通過.NET 4.5中的新聲明來分配角色。

但是,當用戶點擊或輸入站點/ site1時,站點1正在獲取全球站點的聲明,我不希望發生這種情況。

如果非要從全球網站的直接鏈接到/ site1的,我可以用一個控制器動作調用後,將用戶重定向:

FederatedAuthentication.SessionAuthenticationModule.SignOut(); 

和清除FedAuth餅乾。

但是,如果用戶只是將/ site1添加到全球站點URL的後面並且命中,那麼來自Global的聲明會攜帶到claim/site1的聲明。

每個站點應該有自己的權利......

我試圖消除在我PostAuthenticate處理程序FedAuth餅乾在Global.asax中:

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

,但似乎並沒有做訣竅,如果我在Application_PostAuthenticateRequest的第一行放置一箇中斷並查看ClaimsPrincipal.Current.Identities.First()。Claims集合,所有的聲明都來自全局。

所以即使我調用SessionAuthenticationModule.SignOut();並刪除FedAuth Cookie,我仍然需要找到一種方法來從ClaimsPrincipal.Current中刪除索賠,這看起來有點「駭人聽聞」。

有沒有人知道在何處和何時ClaimsPrincipal.Current被賦值?由於它在Global.asax訪問我的處理程序之前訪問/ site1時有全球站點的聲明,因此在管道中必須有其他位置正在填充ClaimsPrincipal.Current的聲明...

有什麼想法?

+0

想知道你是否解決了這個問題。我遇到了同樣的問題。 – CedricB 2013-08-05 20:13:34

回答

0

爲防止FedAuth Cookie在同一域中的應用程序間工作,請爲每個應用程序配置一個具有唯一路徑的Cookie處理程序。

您的應用程序是否將cookie處理程序路徑設置爲「/」?如果是,那麼這允許在應用程序間共享FedAuth cookie。

嘗試將Cookie處理程序路徑設置爲獨特的...例如

<cookieHandler path="/myapplicationpath/" /> 

或 - 完全留下路徑屬性應該完成同樣的事情。