2009-02-21 45 views
3

我有以下代碼:用戶進行身份驗證,但Ticket.UserData缺少

if (HttpContext.Current.Request.IsAuthenticated == false) 
{ 
    // this isn't reached so i know user is Authenticated 
    return; 
} 
FormsIdentity fIdentity = HttpContext.Current.User.Identity as FormsIdentity; 
string[] delimitedUserData = fIdentity.Ticket.UserData.Split('|'); 
// but at this point delimitedUserData.Length is 0 

什麼會導致認證憑證是有效的任何想法尚的UserData沒有了嗎?

我的程序通常工作得很好,所有的UserData都可以輕鬆訪問。但每隔一段時間我都會進入UserData不存在的狀態。

回答

0

票證存儲在cookie中。剛剛在Cookie過期後訪問頁面時,代碼中會發生什麼?

另外請注意,User.Identity.IsAuthenticated將開箱即用,因此該屬性可能不是測試的最佳選擇。

+0

「請注意,User.Identity.IsAuthenticated返回true開箱即用」,該陳述是對發生的事情的嚴重誤導。 ASP.NET中的標準GenericPrinciple類實現了IsAuthenticated類似於get {return!string.IsNullOrEmpty(Name); }`如果user.Identity.Name具有您認證的值。這是一個有效的斷言,因爲真正開箱就不會有user.Identity.Name。只有在代碼中手動修改它(持續1個HTTP請求)或使用Forms Auth,才能在授權請求事件期間同步它的FormsIdentity。 – 2011-02-11 18:22:51

0

本身,FormsAuthentication不會把任何東西放到你的UserData中。在處理票據創建(以及創建UserData)以及追蹤所需路徑的位置附近放置斷點是值得的。

由於您的錯誤是間歇性的,因此可能很難強制觸發。一個可以開始的地方可以追蹤它如何處理cookie過期,或者cookie無效。

如果你使用Firefox,我建議使用「增加N編輯曲奇」插件:https://addons.mozilla.org/en-US/firefox/addon/573

0

不知道這是最好的方法,因爲我仍然是相當新的asp.net,但我在登錄時執行此操作的方式是設置一個會話值,以便我可以在以後的頁面中檢查 - 這樣,如果缺少cookie,我不應該能夠返回值,因此可以轉到登錄頁面。

所以,登錄(在_LoggedIn事件)後直接,我做的:

 // write ClientID to the session 
     Session.Add("ClientID", lClientID); 

然後在登錄後每個頁面的加載,我做的:

if (User.Identity.IsAuthenticated == false || Convert.ToInt32(Session["ClientID"]) == 0) 
    { 
     Server.Transfer("Login.aspx"); 
    } 

到目前爲止,它對我來說工作得很好。

0

我正在尋找相同的問題,並發現問題,我用 「FormsAuthentication.RedirectFromLoginPage」添加cookie。我變成了「response.cookies.add」。和它的工作。