ASP.NET MVC3 Forms身份验证不允许发布登录操作

时间:2012-03-09 10:01:03

标签: asp.net-mvc-3 forms-authentication

与此帖类似:MVC 3 - FormsAuthentication - Can't give access to my Login action

我无法让我的表单将用户名/密码提交给Logon操作的post处理程序。但是,我的AccountController继承自默认控制器,即没有[Authorize] - 属性。我的帐户控制器如下所示:

 [HttpGet]
 public ActionResult LogOn()
 {
     return View();
 }

 [HttpPost]
 public ActionResult LogOn(LogOnModel model, string returnUrl = null)
 {
     ...
 }

我的web.config包含以下内容:

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

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

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

提交登录表单后,会立即将我重定向到LogOn操作的[HttpGet]版本。我从未被定向到POST版本。我得到的答案与上面帖子中提到的相同:

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

如果我评论<authorization>,一切正常。但是,在这种情况下,当我输入指向需要授权的页面的深层链接时,我不会被重定向到登录页面。

我也尝试添加位置“帐户”并允许所有用户,但这似乎没有任何效果。

有谁可以指出我做错了什么?

修改

在Fiddler中我总是看到这种模式:

#   Result  Protocol    Host    URL Body    Caching Content-Type    Process Comments    Custom  
1   302 HTTP    localhost:36372 /   145 private     text/html; charset=utf-8    iexplore:6400           
2   200 HTTP    localhost:36372 /Account/LogOn?ReturnUrl=%2f    4,752   private     text/html; charset=utf-8    iexplore:6400           

为什么第一个网址始终为/

EDIT2

我发现检查生成的HTML,令我惊讶的是它看起来像这样:

<form action="/" id="LogOnForm" method="post">

显然,这不是正确的行动。 ASP代码如下所示:

@using (Html.BeginForm("LogOn", "Account", FormMethod.Post, new { id = "LogOnForm" }))

我的路线看起来像这样:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Account", action = "LogOn", id = UrlParameter.Optional } // Parameter defaults
);

2 个答案:

答案 0 :(得分:1)

您可以使用MVC中的简单授权属性设置授权

    [Authorize]
    public ViewResult SubmitPost()
    {
        return View();
    }    

您必须为授权设置cookie,默认情况下会创建加密的Cookie&amp;将 仅在浏览器关闭时过期

   FormsAuthentication.SetAuthCookie("Name", false);

答案 1 :(得分:0)

您需要为/ account / logon添加位置标记,并允许匿名访问。