MVC中表单认证后如何跳转至指定控制器与视图?
嗨,我来帮你搞定这个问题~你现在的核心问题是手动硬编码重定向到登录页时,没有正确传递当前请求的ReturnUrl参数,导致认证后只能跳转到固定的根路径,没法回到你需要的控制器视图。下面给你几个可行的解决方案:
方案1:用[Authorize]特性自动处理重定向(推荐)
这是Forms认证的标准用法,不需要手动写Redirect逻辑,系统会自动帮你处理ReturnUrl的传递和跳转:
修改你的HomeController代码,给需要认证的Action(或者整个控制器)加上[Authorize]特性:
[Authorize] public class HomeController : Controller { public ActionResult Index() { return View(); } }
这样当未认证用户访问Home/Index时,系统会自动跳转到登录页,并带上正确的ReturnUrl参数:http://localhost:100/MyLogin.aspx?ReturnUrl=%2fHome%2fIndex
等你登录认证成功后,就会自动跳回Home/Index视图啦。
方案2:手动跳转时正确传递ReturnUrl
如果因为特殊需求必须手动处理重定向逻辑,那一定要把当前请求的目标地址作为ReturnUrl传递给登录页:
修改HomeController的Index方法:
public ActionResult Index() { // 获取当前要访问的Action地址作为ReturnUrl var targetUrl = Url.Action("Index", "Home"); // 对ReturnUrl进行Url编码,避免特殊字符问题 var encodedReturnUrl = HttpUtility.UrlEncode(targetUrl); // 拼接完整的登录跳转地址 var loginUrl = $"{FormsAuthentication.LoginUrl}?ReturnUrl={encodedReturnUrl}"; return Redirect(loginUrl); }
关键补充:登录页要正确处理ReturnUrl跳转
不管用哪种方案,你的登录页代码里必须正确读取并使用ReturnUrl参数,才能完成跳转。比如登录逻辑可以这么写:
// 假设这是登录页的验证逻辑 if (IsValidUser(username, password)) { // 生成认证Cookie FormsAuthentication.SetAuthCookie(username, false); // 获取请求中的ReturnUrl string returnUrl = Request.QueryString["ReturnUrl"]; // 验证ReturnUrl是本地地址(防止钓鱼攻击),然后跳转 if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } else { // 如果没有ReturnUrl,跳转到配置的默认页 return Redirect(FormsAuthentication.DefaultUrl); } }
为什么你现在的配置不行?
你当前的Index方法直接跳转到http://localhost:100/MyLogin.aspx?ReturnUrl=%2f,这里的ReturnUrl是固定的根路径/,所以认证后系统只会跳转到根路径对应的默认页(也就是你配置的Default.aspx),而不是你需要的Home/Index。只有把当前要访问的控制器视图地址作为ReturnUrl传递,认证后才能正确跳转过去。
内容的提问来源于stack exchange,提问作者Agnes

