2010-08-23 42 views
2

我需要一個登錄窗體部件塔爾出現在每一頁:asp.net的MVC:開發登錄窗體部件

  1. 當他用戶登錄,如果登錄失敗,用戶被重定向到同一頁面
  2. 重定向到相同頁面,看到錯誤信息提交登錄表單時

widget被渲染與Html.RenderAction ,我把當前頁面的URL(Java腳本),並將其發送到服務器 - 這樣我就可以登錄

後用戶重定向到同一頁面
public ActionResult Login(string email, string password, string returnUrl) 
     { 
      if (userService.AuthenticateUser(email, password)) 
      { 
       FormsAuthentication.SetAuthCookie(email, true); 
       if (!string.IsNullOrEmpty(returnUrl)) 
        return Redirect(returnUrl); 
       return RedirectToAction("Default"); 

      } 
      else 
      { 
       ModelState.AddModelError("login_fail", "login failed"); 
       if (!string.IsNullOrEmpty(returnUrl)) 
        return Redirect(returnUrl); 
       return View(); 
      } 

     } 

問題是何時發生錯誤:我需要將它們展示給用戶,但是在登錄操作重定向後,所有ModelState數據都會丟失(有錯誤)。

問題是:我如何實現登錄小工具來滿足所有上述要求?

回答

2

AJAX是一個可接受的解決方案嗎?這樣你總是呆在同一頁面上,不需要重定向。另一種選擇是將錯誤消息存放在TempData,這樣就可以把它拿來,並顯示它重定向頁面上:

public ActionResult Login(string email, string password, string returnUrl) 
{ 
    if (userService.AuthenticateUser(email, password)) 
    { 
     FormsAuthentication.SetAuthCookie(email, true); 
     if (!string.IsNullOrEmpty(returnUrl)) 
     { 
      return Redirect(returnUrl); 
     } 
     return RedirectToAction("Default"); 
    } 

    if (!string.IsNullOrEmpty(returnUrl)) 
    { 
     TempData["message"] = "login failed"; 
     return Redirect(returnUrl); 
    } 
    ModelState.AddModelError("login_fail", "login failed"); 
    return View(); 
} 

而且出於安全原因,以驗證returnUrl屬於您的域名重定向或之前是非常重要的黑客可能會創建一個鏈接,並指向某個欺騙網站,該網站看起來與您的網站完全相同,並且會誘使用戶再次輸入其用戶名和密碼。 Visual Studio中的默認ASP.NET MVC模板遭受同樣的漏洞。

+0

謝謝,寶貴的意見。 什麼我不喜歡TempData - 我不能使用Html.ValidationSummary顯示錯誤 - 我必須用手做 – kilonet 2010-08-23 11:03:16

+1

@kilonet,你可以看看Jeremy Skinner的博客文章:http:// www。 jeremyskinner.co.uk/2008/10/18/storing-modelstate-in-tempdata-with-aspnet-mvc/可從這裏獲得源代碼:http://github.com/mvccontrib/MvcContrib/blob/master/src /MVCContrib/Filters/ModelStateToTempDataAttribute.cs,或者如果您已經在使用'MVCContrib',您可以直接使用此操作過濾器。這是一個非常乾淨的方法。 – 2010-08-23 11:50:54