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

11

我正在开发一个mvc .net应用程序,并使用表单认证。我想在用户获得认证后将其重定向到他请求的页面。任何帮助将不胜感激。

我要如何做呢?

1个回答

31

如果您创建一个ASP.NET MVC 3或4互联网应用程序项目,它将包含如何在身份验证时使用返回URL的完整示例。

当您向控制器添加AuthorizeAttribute以强制进行身份验证时,它会重定向用户到您的登录方法,并自动附加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 的工作原理,这篇 StackOverflow 文章展示了如何使用原始请求设置 returnUrl。

您还需要确保验证 returnUrl 真的是本地 url,否则您将容易受到开放重定向攻击。 RedirectToLocal() 是 MVC 4 Internet 应用程序模板中的一个帮助方法,它执行此验证:

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

2
@HediNaily:一个需要记住的要点是不要相信 returnUrl,并在使用它重定向用户之前进行检查。 - mohsen dorparasti
2
@mohsen.d 同意。RedirectToLocal()是一个MVC 4助手,包含在Internet应用程序模板中,在重定向之前验证URL。我会将其添加到答案中,以供那些没有助手方法的人使用。 - mfanto
对于那些使用ReSharper的用户来说,重要的一点是,ReSharper会告诉你可以删除Html.BeginForm中的ReturnUrl =部分,因为不需要显式名称。但在这种情况下,它是必需的。 - hvaughan3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接