ReturnUrl指向一个ActionResult
这是情景如何:
TestController
的Index
方法的链接 TestController
上的ActionMethod Index
Action Method TestController :
[Authorize]
public class TestController : Controller
{
// GET: Test
public ViewResult Index()
{
return View();
}
[ValidateInput(false)]
public ActionResult ActionTest()
{
return new EmptyResult();
}
}
HomeController :
[Authorize]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
AccountController :
public class AccountController : Controller
{
[AllowAnonymous]
public ActionResult Login()
{
return View();
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
try
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
return RedirectToAction(controllerName: "Home", actionName: "Index");
}
catch
{
return View(model);
}
}
return View(model);
}
}
Login.chtml
@model TestLoginProject.Models.LoginViewModel
@{
Layout = null;
}
<!DOCTYPE html>
<html lang="en">
<head>
.....................
</head>
<body>
<div class="container">
@using (@Html.BeginForm("Login", "Account", new { returnUrl = Request.QueryString["ReturnUrl"] }, FormMethod.Post, new { @class = "form-signin" }))
{
@Html.AntiForgeryToken()
....................
....................
}
</div>
</body>
</html>
Web配置
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="1" />
</authentication>
返回网址的期望是 :
HTTP://本地主机:2441 /帐号/登录RETURNURL =%2fTest%2fIndex
相反,当前值是 :
HTTP://本地主机:2441 /帐号/登录RETURNURL =%2fTest%2fActionTest
备注 :
这是你提到的一种正常行为!
MVC框架将用户重定向到Login页面,并将ActionMethod名称附加到URL,而不是附加Index
Action Method
非常感谢MVC安全管道。 当您使用表单身份验证并且用户未通过身份验证或授权时,ASP.NET安全管道将重定向到登录页面,并将returnUrl
作为参数传递给重定向到登录页面的页面 (以下是需要授权的控制器操作你通过点击链接调用)。
所以在这里你不能期望索引(当前加载的页面没有有效和持久的认证),随后ActionMethod
调用安全管道,并且returnurl
枚举returnurl
。
请注意,这是因为Controller和View之间的同步通信。
链接地址: http://www.djcxy.com/p/57859.html