MVC C#中登录过期退出后如何重定向至原页面?
完全可以实现这个需求!
你看到的/Account/Login?ReturnUrl=%2Fhome%2Ftest里的ReturnUrl参数就是关键——MVC5 Identity已经帮你自动记录了超时前用户所在的页面地址,接下来只需要在登录逻辑里正确处理这个参数,就能实现登录后跳转回原页面的效果。
下面是具体的实现步骤:
1. 在Login Get方法中接收并传递ReturnUrl
首先确保你的AccountController里的Get请求Login方法接收returnUrl参数,并把它传递给视图:
[HttpGet] [AllowAnonymous] public ActionResult Login(string returnUrl) { // 将ReturnUrl存入ViewBag,方便视图使用 ViewBag.ReturnUrl = returnUrl; return View(); }
2. 登录成功后根据ReturnUrl重定向
在Post请求的Login方法里,当用户登录验证通过后,先检查returnUrl是否是有效的本地URL(这一步非常重要,能避免开放重定向安全漏洞),如果有效就跳转到该地址,否则跳转到默认首页:
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { if (!ModelState.IsValid) { return View(model); } // 执行登录验证 var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); switch (result) { case SignInStatus.Success: // 验证ReturnUrl的有效性:必须是本地URL且不为空 if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } else { // 默认跳转到首页 return RedirectToAction("Index", "Home"); } case SignInStatus.LockedOut: return View("Lockout"); case SignInStatus.RequiresVerification: return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); case SignInStatus.Failure: default: ModelState.AddModelError("", "无效的登录尝试,请检查账号密码。"); return View(model); } }
3. 在登录视图中传递ReturnUrl参数
打开Login.cshtml视图,确保表单提交时能把returnUrl参数带到Post方法里,通常通过隐藏字段实现:
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken() <!-- 账号、密码输入框等内容 --> <!-- 添加隐藏字段传递ReturnUrl --> @Html.Hidden("returnUrl", ViewBag.ReturnUrl) <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="登录" class="btn btn-default" /> </div> </div> }
4. 确认超时退出的Cookie配置
最后检查你Startup类里的Cookie认证配置,确保LoginPath设置正确,并且会话超时配置符合你的需求:
app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, // 超时后跳转的登录页面,Identity会自动附加ReturnUrl LoginPath = new PathString("/Account/Login"), Provider = new CookieAuthenticationProvider { OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>( validateInterval: TimeSpan.FromMinutes(30), // 你的超时验证间隔 regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) }, ExpireTimeSpan = TimeSpan.FromMinutes(30), // 会话超时时间 SlidingExpiration = true // 滑动过期:用户有操作时自动重置超时时间 });
只要完成以上步骤,当用户从home/test页面因超时退出并跳转至登录页时,登录成功后就会自动回到home/test页面了。
内容的提问来源于stack exchange,提问作者Parvez




