我正在开发一个mvc .net应用程序,并使用表单认证。我想在用户获得认证后将其重定向到他请求的页面。任何帮助将不胜感激。
我要如何做呢?
我正在开发一个mvc .net应用程序,并使用表单认证。我想在用户获得认证后将其重定向到他请求的页面。任何帮助将不胜感激。
我要如何做呢?
如果您创建一个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");
}
}
Html.BeginForm
中的ReturnUrl =
部分,因为不需要显式名称。但在这种情况下,它是必需的。 - hvaughan3