代码之家  ›  专栏  ›  技术社区  ›  x__dos

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

  •  2
  • x__dos  · 技术社区  · 15 年前

    我需要一个登录小部件出现在每一页上:

    1. 当用户登录时,他会被重定向到同一个页面
    2. 如果登录失败,用户将重定向到同一页并查看错误消息

    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数据都会丢失(有错误)。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Darin Dimitrov    15 年前

    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 在重定向之前属于您的域,或者黑客可以创建链接和 返回URL 指向某个与你的完全相同的欺骗网站,欺骗用户再次输入用户名和密码。默认值ASP.NET visualstudio中的MVC模板也存在同样的漏洞。