2009-09-08 75 views
4

我們有一個用於註冊的電子郵件確認頁面,可以使用一次性鏈接來激活該帳戶。在Site.Master中使用LogonUserControl的Asp.net Mvc FormsAuth

該網站的性質是這樣的,我們可以讓這個鏈接自動登錄用戶。這項要求正在審查中(應我的要求!)。

以下情況被證明是一個有點混亂:

  1. 用戶按照他們的電子郵件
  2. 確認控制器上這土地上的確認鏈接。
  3. 所有的事情都是好的,該用戶將自動登錄,使用:

    FormsAuth.SignIn(user.UserName,false); 
    
  4. 從控制器

視圖返回視圖使用其中包含部分母版頁視圖是LogonUserControl.ascx組件。 內成分,有以下代碼(說到直出asp.net的MVC項目模板):

if (Request.IsAuthenticated) { /*foo*/ } 

當頁面呈現,Request.IsAuthenticated是儘管在控制器簽約用戶返回false 。

我想知道爲什麼這可能是。在調用FormsAuth.SignIn方法或者使用請求對象進行此檢查時,主服務器是否已經寫出錯誤,因爲在收到請求時,它確實沒有進行身份驗證?

編輯:它顯示默認LogOn控制器使用重定向而不是返回視圖。這當然會解決問題,但是我對上述場景爲什麼不起作用感興趣。

回答

3

它不起作用,因爲在您的操作運行之前已經發生的請求未通過身份驗證。請求要麼被認證,要麼不是;它不能以未經認證的方式開始生活,並在行動中獲得認證。已認證的請求是使用有效的認證憑證提交的。由於登錄請求沒有包含該信息,因此它未經過身份驗證,無法進行身份驗證。

但是,當您重定向時,瀏覽器會發出一個新請求,當然,這個請求會附帶有效的身份驗證票證,通常以Cookie的形式提供。

順便說一句,在這種情況下重定向是正確的。你的登錄名是POST,你應該使用Post/Redirect/Get模式。試想一下,登錄頁面會將用戶返回到網站主頁。如果您返回視圖而不是重定向到主頁,那麼當用戶按F5刷新頁面時,瀏覽器會警告他們他們將重新提交他們的登錄憑據,這不是您想要的。做一次重定向會使瀏覽器爲主頁做一個GET,所以如果用戶按F5,用戶不會被警告。

+1

很好的解釋,一段時間跑到這裏,從來沒有理解爲什麼,現在我做。 – mxmissile 2009-09-08 20:29:37