2012-07-30 132 views
5

我有這段代碼何時登錄用戶,該字符串sUserData設置正確。表單身份驗證不正確驗證用戶

Dim sUserData As String = HttpContext.Current.Request.Cookies("UserID").Value & "|" & HttpContext.Current.Request.Cookies("UserName").Value & "|" & HttpContext.Current.Request.Cookies("UserEmail").Value 

    Dim fat As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, _ 
    HttpContext.Current.Session("UserID"), DateTime.Now, _ 
    DateTime.Now.AddDays(6), True, sUserData, _ 
    FormsAuthentication.FormsCookiePath) 
    HttpContext.Current.Response.Cookies.Add(New HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(fat))) 

然後,我有代碼,我檢查用戶是否在共享(靜態)方法簽署了在一個公共類這樣的:

If HttpContext.Current.User.Identity.IsAuthenticated Then 
EndIf 

這工作得很好,但如果我擺在Page_Load中,而不是共享的方法在同一行一類的它永遠不會進入這個if語句

If HttpContext.Current.User.Identity.IsAuthenticated Then 
    EndIf 

這究竟是爲什麼,是有一些方法來重新寫的代碼 - 工作在Page_L後面oad,而不必將其放入類中,該類用於標題以允許訪問某些頁面 - 因此可以正常工作。但是我需要在默認頁面上使用另一種用戶身份驗證方式來根據用戶登錄的天氣來更改標籤和按鈕,並且這不能在課程中完成。

+0

是否有任何特定的原因,你手動創建該cookie,而不是使用'FormsAuthentication.SetAuthCookie()'你的代碼可能工作,但.NET會爲你做。 (只是一個觀察)。 – 2012-07-30 20:20:01

+0

是的,有 - 它必須是這樣的,已經有10k以上的用戶,我的工作是不改變所有它只是讓我的代碼與現有分區工作 – 2012-07-30 20:20:51

+0

是不是你試圖檢查中的國旗SAME請求你創建cookie?這不起作用,因爲上下文將從您設置cookie的請求旁邊的請求開始。 – 2012-07-30 20:24:23

回答

2

您是否嘗試將頁面事件覆蓋轉換爲實際頁面事件覆蓋(即OnLoad)而不是Page_Load事件掛接實現?更高性能(更少的調用層次),生命週期中的細微差異可能適合您的需求,並可能提取這些症狀的原因。

There 可能如果靜態方法調用的上下文和Page_Load是排序問題/競爭條件,我認爲Wiktor Zychla已經指出你已經朝着提琴手的方向發展。

+0

我想明白了,那是在正確的方向 - 我的sUserData總是正確的,但我沒有意識到這是會話(「用戶ID」)沒有設置,然後整個身份驗證票未設置,實際上它已設置,但值爲空 – 2012-08-01 19:19:55