通常这应该自动发生。当匿名用户访问受保护的资源(他是匿名的,因为他的会话已过期)时,FormsAuthentication 模块会拦截此请求并重定向到您在 web.config 中注册的 loginUrl,方法是附加一个指向受保护的资源。
因此,例如,如果您将~/Account/LogOn 配置为您的登录网址,并且匿名用户尝试访问受保护的~/Foo/Bar 资源,他将被重定向到~/Account/LogOn?ReturnUrl=%2FFoo%2FBar。
然后他将看到一个登录页面,他将在其中输入他的凭据并将表单提交给Account 控制器上的[HttpPost] LogOn 操作。凭据将被验证,如果有效,将生成一个新的表单身份验证 cookie,并将用户重定向到最初请求的受保护资源。
以下是登录操作的相应代码:
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
注意用户是如何在成功验证后重定向到默认的Home/Index 或returnUrl 参数的。
当然,我在这里讲述的所有这些故事都适用于 Visual Studio 创建的默认 ASP.NET MVC 模板。如果出于某种原因您修改了此模板,这可能会解释您所观察到的行为。
无论如何,从我的回答中要记住的是,如果您使用表单身份验证,该模块将作为 ReturnUrl 查询字符串参数将最初请求的受保护资源传递给配置的登录页面。因此,您可以在成功验证后将用户重定向到此页面。