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

11 authentication asp.net-mvc forms-authentication asp.net-mvc-3

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

mfa*_*nto 31

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

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

public ActionResult Login(string returnUrl)
{
     ViewBag.ReturnUrl = returnUrl;
     return View();
}
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl)
{
     return RedirectToLocal(returnUrl);
}
Run Code Online (Sandbox Code Playgroud)

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

如果要查看AuthorizeAttribute的工作方式,此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");
     }
}
Run Code Online (Sandbox Code Playgroud)

  • @HediNaily:要记住的一点是不要信任returnUrl并在使用它来重定向用户之前检查它 (2认同)
  • @ mohsen.d同意.RedirectToLocal()是Internet应用程序模板附带的MVC 4帮助程序,可在重定向之前验证URL.我会将它添加到那些没有辅助方法的人的答案中. (2认同)