2012-07-25 54 views
0

在自定義ActionFilterAttribute的OnActionExecuting方法期間,我們確保用戶在執行某些操作之前仍然登錄。MVC的ActionExecutingContext HttpContext.User.Identity.IsAuthenticated在多個瀏覽器選項卡上登錄時返回False

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
    { 
     // Do something... 
    } 
} 

我有與唯一的區別是虛擬目錄名相同的域名下運行多個客戶端的多個站點:我們做類似這樣的僞代碼的東西做到這一點。每個虛擬目錄實際上指向相同的文件夾/代碼庫,並且URL/virdir名稱指示代碼在嵌套/客戶端目錄中使用哪個「客戶端配置文件」。不知道是否需要站點/代碼/ IIS配置中的詳細信息,但是如果出現任何問題,則提供該問題的罪魁禍首。

如果我嘗試使用瀏覽器的多個實例登錄多個網站,則一切正常。當我嘗試瀏覽網站時,IsAuthenticated檢查返回true。

但是,如果我嘗試使用單個瀏覽器登錄多個網站並使用多個選項卡,我總是來回登出。如果我登錄到網站A,則可以瀏覽,但只要登錄到網站B,如果我嘗試在網站A中的任何位置導航,則IsAuthenticated返回false。

這是預期的行爲?有沒有解決這個問題的方法?

更新:我現在只能夠在IE中重現此行爲。在Firefox和Chrome中,無論我使用的是同一個瀏覽器/多個標籤頁還是多個瀏覽器,我都可以啓動登錄屏幕。 IE處理Cookie的方式有什麼不同?或者不是餅乾的罪魁禍首?

回答

0

不知道你的設置更多的細節,這是我所期望的。

假設:

  1. 幽州,你必須指向一個代碼庫多個虛擬目錄。
  2. 這些虛擬目錄中的每一個最有可能設置爲應用程序是IIS。
  3. 你不必在你的web.config中定義,因此,每個虛擬目錄自動生成的自己的加密/解密密鑰

什麼是可能發生的計算機密鑰:

  1. 當您從不同的瀏覽器登錄時,每個瀏覽器都會獲得身份驗證Cookie。由於您使用的是不同的瀏覽器,因此不存在任何問題。
  2. 當使用相同的瀏覽器時,您登錄到站點A並獲得一個使用siteA自動生成的密鑰加密的加密cookie。
  3. 當您嘗試轉到具有其他自動生成的機器密鑰的另一個虛擬目錄時,該站點無法讀取認證憑證(無法解密),因此返回登錄= false。
  4. 一旦您登錄到siteB,身份驗證cookie將被替換爲來自siteB的身份驗證票證。此時,siteA不能再解密認證票證並返回登錄= false。

嘗試使用適當的選項(MSDN on machineKey element)設置web.config的機器密鑰配置部分。 Here是關於表單身份驗證票和過程的更多信息

相關問題