asp.net mvc:开发登录小部件

时间:2010-08-23 10:44:25

标签: asp.net-mvc

我需要在每个页面上显示一个登录小部件:

  1. 当用户登录时,他被重定向到同一页面
  2. 如果登录失败,用户会重定向到同一页面并看到错误消息
  3. 小部件使用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();
                }
    
            }
    

    问题在于错误发生时:我需要向用户显示它们,但在从Login操作重定向后,所有ModelState数据都会丢失(有错误)。

    问题是:如何实现登录小部件以满足上述所有要求?

1 个答案:

答案 0 :(得分: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是否属于您的域,或者黑客可以创建链接并且returnUrl指向某个与您的网站完全相同的欺骗网站,这一点非常重要并且欺骗用户再次输入他的用户名和密码。 Visual Studio中的默认ASP.NET MVC模板也存在同样的漏洞。