身份验证后重定向到请求的页面

时间:2012-10-30 19:08:52

标签: asp.net-mvc asp.net-mvc-3 authentication forms-authentication

我正在使用mvc .net应用程序,我正在使用表单身份验证。我希望在用户进行身份验证后将用户重定向到他请求的页面。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:31)

如果您创建一个ASP.NET MVC 3或4 Internet应用程序项目,它将有一个完整的示例,说明如何在进行身份验证时使用返回URL。

将AuthorizeAttribute添加到控制器以强制进行身份验证时,它会将用户重定向到Login方法,并自动附加returnUrl参数。从那里,您需要在显示登录表单时跟踪它:

public ActionResult Login(string returnUrl)
{
     ViewBag.ReturnUrl = returnUrl;
     return View();
}

然后将其添加到您的登录表单的路径集合中:

@*//ReSharper disable RedundantAnonymousTypePropertyName*@
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
@*//ReSharper restore RedundantAnonymousTypePropertyName*@

}

用户提交登录后,假设他们正确认证,您只需重定向到returnUrl:

[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl)
{
     return RedirectToLocal(returnUrl);
}

最难的部分是通过GET / POST序列跟踪ReturnUrl。

如果您想了解AuthorizeAttribute的工作原理,this StackOverflow 帖子会显示使用原始请求设置returnUrl。

您还需要确保验证returnUrl确实是本地URL,否则您将容易受到打开重定向攻击。 RedirectToLocal()是执行此验证的MVC 4 Internet Application模板的辅助方法:

private ActionResult RedirectToLocal(string returnUrl)
{
     if (Url.IsLocalUrl(returnUrl))
     {
          return Redirect(returnUrl);
     }
     else
     {
          return RedirectToAction("Index", "Home");
     }
}