MVC 5表单不会POST到[AllowAnonymous]方法

时间:2014-11-03 23:14:34

标签: c# asp.net-mvc authentication

我正在尝试为我的MVC 5项目创建一个登录表单。我已经使用了身份验证,因此我的控制器使用[Authorize]进行了修饰。当我启动我的项目时,我被正确地引导到我的匿名登录操作:

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

我在此视图中设置了我的POST表单。生成的HTML看起来很好。

然后我添加了一个应该接受表单提交的新方法:

[HttpPost]
[AllowAnonymous]
public ActionResult Login(FormCollection formCollection)
{
    ...

我发现当我提交表单时,我的第一个Login方法被调用 - 显然是由某些身份验证问题引起的重定向。 (Fiddler跟踪显示我的表单在POST时被发送到/ Login?key = myKeyHere 而不是使用key = myKeyHere 作为表单条目发布到/ Login此外,如果我将身份验证的重定向URL从/ Login更改为/ SomethingElse,表单提交会将我重定向到/ SomethingElse,而不是将其发布到/ Login。)

如果我从控制器中删除[Authorize],我的表单提交就可以了。

我的两个方法同名(Login)似乎不是问题,因为我可以重命名接受POST的方法,更改我的表单操作,然后提交给我,我再次被重定向到我的GET登录页面。

如何将表单发布到[AllowAnonymous]方法,我需要做什么?

更新以包含我的观看次数 我的观点已经使用了POST操作:

@using (Html.BeginForm("Login", "Home", FormMethod.Post))
{
    @Html.TextBox("key", string.Empty, new { @class = "input_centered", id = "key_text"})
    <input type="submit" id="key_submit" class="enter" name="submit" value="Enter" />
}

生成的HTML看起来不错:

<form action="/Login" method="post">
<input class="input_centered" id="key_text" name="key" type="text" value="" />
<input type="submit" id="key_enter" class="enter" name="submit" value="Enter" />

2 个答案:

答案 0 :(得分:0)

您登录表单只是收集数据以允许您获得授权。当您发布表单时,它将转到POST方法(具有[Authorize]属性),看到您尚未授权(在此阶段尚未调用任何方法来授权您),并立即将您重定向回登录页面,从而创建一个无限循环。

您的POST方法需要[AllowAnonymous]属性,然后在该方法中执行授权逻辑。从现在开始授权,您可以访问标有[Authorize]

的其他操作方法

答案 1 :(得分:0)

问题是你正在使用FormCollection对象,它太宽泛而且MVC引擎无法构建或映射(反序列化)你发布的数据到FormCollection对象因此无法找到任何匹配的Action for post。尝试将FormCollection转换为可序列化的对象。

例如。

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginViewModel model)