与此帖类似: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
);
答案 0 :(得分:1)
您可以使用MVC中的简单授权属性设置授权
[Authorize]
public ViewResult SubmitPost()
{
return View();
}
您必须为授权设置cookie,默认情况下会创建加密的Cookie&amp;将 仅在浏览器关闭时过期
FormsAuthentication.SetAuthCookie("Name", false);
答案 1 :(得分:0)
您需要为/ account / logon添加位置标记,并允许匿名访问。