我正在开发一个 mvc .net 应用程序,并且正在使用表单身份验证。我想在用户通过身份验证后将用户重定向到他请求的页面。任何帮助,将不胜感激。
user1600279
问问题
17736 次
1 回答
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 是如何工作的,这篇 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");
}
}
于 2012-10-30T19:26:59.247 回答