2013-04-11 159 views
13

我有一個MVC4/IIS/Forms身份驗證奇怪的間歇性問題。MVC4/IIS/Forms身份驗證SSO問題

我有一對使用SSO將控制權交給彼此的網站。大部分時間切換正確發生,並且用戶按照預期被重定向到下一個站點。但是,在某些情況下,即使發送了有效的SSO信息,也會要求用戶重新登錄。 SSO方法裝飾有[AllowAnonymous]屬性,並且web.config也具有允許所有用戶訪問/account/sso的位置條目。

當目標網站第一次被擊中時,似乎會發生這種情況 - 一旦應用程序池被預熱,問題就會消失。

的其他一些觀點:

1這兩個網站是.NET 4,所以不應該有任何遺留加密問題。
2.本期發生相當罕見(< 10%的時間),所以代碼本身應該健全
3.託管是在win7x64 IIS 7.5在當地,和天藍色 - 發生在這兩個地方
4.似乎與瀏覽器無關

<location path="account/sso"> 
    <system.web> 
     <authorization> 
      <allow users="*" /> 
     </authorization> 
    </system.web> 
</location> 

[Authorize] 
public class AccountController : BaseControllerTestable 
{ 
    public AccountController() 
     : base() 
    { 
    } 

    [AllowAnonymous] 
    public ActionResult SSO(string AuthToken, string Target) 
    { 
     //SSO logic here 

    } 
} 

任何想法?

+0

新會話啓動時是否顯示登錄屏幕? 這兩個Web應用程序的會話超時設置如何? 他們有不同的應用程序池嗎?這些泳池是否有回收設置? 確實可以終止站點的性能計數器並記錄站點的相關性能計數器,如會話超時,重新編譯? – Siraf 2013-04-11 20:07:28

+0

聽起來像絕對不是代碼問題。如果您使用Cookie或應用程序池回收,我的猜測可能是Cookie超時。在認證邏輯中添加一些跟蹤,發生問題時是否執行SSO方法? – Sergey 2013-04-16 01:26:47

回答

0

我想我終於解決了它(我們只知道肯定,一旦我們有一個很好的,同時不復發因爲它是間歇反正)

兩個因素髮揮了作用。首先,我注意到一些靜態項目(主要是css + js文件),即使它們應該可以自由訪問,但它們在認證循環中陷入了困境,所以我在web.config中添加了一個位置規則,以確保它們被允許匿名用戶訪問。我還添加了一個路由例外,以忽略favicon.ico的好請求。這似乎阻止了代碼在第一次驗證時跳過自身。最後,問題的原因是間歇性的原因是另一個錯誤,如果有其他會話打開(數據庫驅動),問題沒有發生。這就解釋了爲什麼這個錯誤只發生在早上,即:前一天的所有會話都已過期。

0

什麼是您的BaseControllerTestable?你有任何授權屬性嗎?基類將在派生類上的其他方法前實例化。因此,如果有任何機會,您可能會對您有任何問題,在基本控制器上有[授權]。

1

您在Controller類上有一個Authorize屬性,這意味着您的SSO方法將應用AllowAnonymous和Authorize。在這種情況下,授權屬性看起來像需要刪除。