2011-12-28 47 views
21

這段代碼是從asp.net的MVC RTM的源代碼誰來制定HttpContext.User.Identity

誰來制定HttpContext.User.Identity的IsAuthenticated屬性的IsAuthenticated屬性?

protected virtual bool AuthorizeCore(HttpContextBase httpContext) { 
     if (httpContext == null) { 
      throw new ArgumentNullException("httpContext"); 
     } 

     IPrincipal user = httpContext.User; 
     if (!user.Identity.IsAuthenticated) { 
      return false; 
     } 
    } 

是對IsAuthenticated屬性通過調用方法(asp.net的MVC 4.0示例項目)設置:

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

當我調試asp.net的MVC的LogOn支持方法的代碼上述FormsAuth ...方法調用後的4.0示例項目。執行

User.Identity.IsAuthenticated 

仍然返回FALSE。只有當我調試註銷等方法

User.Identity.IsAuthenticated 

說TRUE。那麼誰將這個屬性設置爲TRUE和WHEN?

UPDATE

這是關於表格認證!

我現在調試了asp.net mvc示例項目的LogOn方法,並且在LogOn操作返回後,我調用了我重寫的AuthorizeCore方法,然後IsAuthenticated屬性爲TRUE!

TRUE的設置是否取決於ModelState.Value.Error集合?

如果錯誤集合計數== 0的IsAuthenticated是TRUE 否則IsAuthenticated是假

你能否證實?

回答

22

此屬性由窗體身份驗證模塊通過讀取和分析來自請求窗體身份驗證Cookie設置。我以粗體顯示請求,因爲我懷疑這就是您觀察此行爲的原因。讓我解釋。當您在成功驗證後致電FormsAuthentication.SetAuthCookie時,您正在將驗證Cookie添加到響應。這個cookie將被存儲在客戶端瀏覽器上,並將在後續請求中發送。所以只有在隨後的請求中,用戶纔會被視爲已通過身份驗證。所以你需要在調用SetAuthCookie方法後總是重定向。在調用此方法的請求內部,您已經知道用戶是否提供了正確的憑據,因此您不需要檢查IsAuthenticated屬性。

+0

沒有源代碼鏈接,但判斷你的其他asp.net mvc解決方案我發現你是專家;-)我喜歡上面的解釋與許多人不理解/發現谷歌搜索在同一主題的幫助後續請求。 – Elisabeth 2011-12-29 09:46:43

+0

@DarinDimitrov如果響應被寫入了正確的cookie,其中包含FormAuthentication憑證,並且驗證成功後。 asp.net將從請求中讀取並解析它。它將確定'IsAuthenticated'是否爲真。任何問題,請糾正我。謝謝。 – 2015-08-13 11:24:13

1

屬性的來源取決於Identity的類型。對於FormsIdentity,酒店僅返回true:

/// <devdoc> 
/// Indicates whether or not authentication took 
/// place. 
/// </devdoc> 
public bool       IsAuthenticated { get { return true;}} 

這是有道理的,因爲在FormsAuthenticationModule.cs的代碼只assignes驗證後FormsIdentity。代碼看起來相當複雜,我發現它從cookie中提取了一張票,但是我無法找到它在哪裏驗證票。

+0

對不起Andomar我沒有寫全部關於窗體身份驗證。我編輯了我的問題。 – Elisabeth 2011-12-28 20:06:32

+0

我到目前爲止在google中讀過的內容,以及經過一些測試後,FormsAuthentication.SetAuthCookie需要被設置爲IsAuthenticated返回true。用var isAuthenticated = base.AuthorizeCore(httpContext);在我的覆蓋AuthorizeCore方法。其實它應該被稱爲AuthenticateCore,但那是另一回事。我會很高興,並將其標記爲解決方案,如果任何人有微軟鏈接/證明無論什麼使IsAuthenticated跳轉爲true! – Elisabeth 2011-12-28 21:13:44