MVC 3 - FormsAuthentication - 无法访问我的登录操作

时间:2011-05-06 14:05:43

标签: asp.net-mvc-3 c#-4.0 razor

我正在使用MVC 3和FormsAuthentication:

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

我的帐户/索引页面显示一个登录页面,然后使用Jquery,它会在帐户/登录中发布一个帖子来验证用户身份。这是我处理它的AccountController操作:

[HttpPost]
[Authorize(Users = "*")]
public ActionResult Login(string userName, string password) {
    ...
}

发布到它的Jquery:

$.post("/account/login", {
                "userName": $("#userName").val(),
                "password": $("#password").val()
            }, function (data) {
...});

所有上述工作,但现在我想限制对网站的一般访问,所以我将其添加到我的根web.config:

<authorization>
  <deny users="?" />      
</authorization>

为了尝试允许访问帐户控制器,我添加了这个:

<location path="~/Account">
<system.web>
  <authorization>
    <allow users="*"/>
  </authorization>
</system.web>
</location>

这是我的问题。我可以查看登录页面(帐户/索引),但我无法提交到帐户/登录。当我通过Fiddler观察正在发生的事情时,我会在发布到该页面时从服务器返回此文本:

<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/Account/?ReturnUrl=%2faccount%2flogin">here</a>.</h2>
</body></html>

似乎当我将“〜/ Account”添加到完整的授权用户列表时,它实际上并不像在非mvc项目中那样工作。在MVC 3中有没有一种特殊的方法呢?

2 个答案:

答案 0 :(得分:6)

控制器的路径通常不作为相对路径引用。您应该只能说location =“Account”,例如

<location path="Account">

不能确定这是你的问题,因为我现在无法测试它,但它可能是......

答案 1 :(得分:2)

根本不要使用AuthorizeAttribute进行登录操作。要求授权过程本身是没有意义的。

要求您创建所有控制器的授权

[Authorize]
public class AuthorizeController : Controller 
{
}

并从AccountController以外的所有控制器扩展。