0

我有Controller两个动作,Logon没有任何装饰器和LogOn装饰[HttpPost]器。

代码:

        public ActionResult LogOn()
        {
            return View();
        }

        [HttpPost]
        public ActionResult LogOn(string username, string password, 
            bool? rememberMe, string returnUrl)
        {
            AccountService client = new AccountService();

            if (client.IsUserAllowedIn(username, password))
                FormsAuthentication.SetAuthCookie(username, rememberMe ?? false);

            return Redirect(returnUrl);
        }

我面临的问题是:当我尝试使用[Authorize]装饰器访问方法时,ASP.NET MVC不会重定向到我LogOn使用[HttpPost]装饰器的操作。

出于测试目的,我创建了一个名为LogOnusing的表单,Post它可以正常工作。所以我想问题在于我使用装饰器的方式。

我的web.config

    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication>

关于我做错了什么的任何想法?

4

1 回答 1

1

我面临的问题是:当我尝试使用 [Authorize] 装饰器访问方法时,ASP.NET MVC 没有使用 [HttpPost] 装饰器重定向到我的 LogOn 操作。

当然不会。根据最基本的定义,重定向意味着 GET 请求。您不可能期望您能够重定向到只能通过 POST 动词访问的控制器操作。这不可能。

除此之外,为什么您希望受保护的资源将您重定向到应该验证您的凭据的控制器操作。人们通常期望的是,当有人试图访问受保护的资源时,他会被重定向到一个控制器操作,该操作将呈现一个登录表单,用户可以在其中输入他的凭据,将此表单提交给相应的 POST 操作以进行验证,如果他的凭据是有效的 POST 操作将发出一个表单身份验证 cookie 并将他重定向回返回 URL,该 URL 指向他最初请求的受保护资源。

于 2013-01-29T13:10:41.127 回答