ReturnUrl指向一个ActionResult

这是情景如何:

  • 从头开始一个MVC项目
  • 测试控制器使用[授权]属性进行装饰
  • 用户登录并指向主页
  • 用户单击一个重定向到TestControllerIndex方法的链接
  • 用户等待表单身份验证超时60秒
  • 用户单击一个链接,该链接调用驻留在TestController上的ActionMethod
  • MVC框架将用户重定向到Login页面,并将ActionMethod名称附加到URL,而不是附加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

    备注

  • 当用户在超时后单击链接时,在重定向到登录页面之前,没有测试操作被命中
  • 在VS2017中从头开始创建Empty MVC项目时,所有路线都是默认设置

  • 这是你提到的一种正常行为!

    MVC框架将用户重定向到Login页面,并将ActionMethod名称附加到URL,而不是附加Index Action Method

    非常感谢MVC安全管道。 当您使用表单身份验证并且用户未通过身份验证或授权时,ASP.NET安全管道将重定向到登录页面,并将returnUrl作为参数传递给重定向到登录页面的页面 (以下是需要授权的控制器操作你通过点击链接调用)。

    所以在这里你不能期望索引(当前加载的页面没有有效和持久的认证),随后ActionMethod调用安全管道,并且returnurl枚举returnurl

    请注意,这是因为Controller和View之间的同步通信。

    链接地址: http://www.djcxy.com/p/57859.html

    上一篇: ReturnUrl Points to an ActionResult

    下一篇: Custom routing in asp.net mvc 4