-1

我正在尝试创建注销功能,但由于某种原因,我的 AntiForgeryToken 未能传回控制器类。我正在使用 MVC4。我正在使用 SimpleMembership。

这是我的代码。

拉扎尔代码

 <div id="loginBar">
    @if (Request.IsAuthenticated)
    {
        <strong>@Html.Encode(User.Identity.Name)</strong>

        Html.BeginForm("LogOut", "Account");
        {
             @Html.AntiForgeryToken()
             @Html.ActionLink("Log-Out", "LogOut", "Account")
         }            
    }
    else
    {
        @Html.ActionLink("Register Me", "Registration", "Account")
        <span> | </span>
        @Html.ActionLink("Log In", "LogIn", "Account")
    }
</div>

帐户控制器类

[HttpGet]
[ValidateAntiForgeryToken]
public ActionResult LogOut()
    {
        WebSecurity.Logout();


        return RedirectToAction("index", "Home");
    }
4

4 回答 4

1

LogOut 是一种发布方法。这就是您收到此错误的原因。预计ValidateAntiForgeryToken将发布数据到请求中。将方法更改为HttpPost.

于 2013-07-22T15:00:48.023 回答
0

更改代码

Html.BeginForm("LogOut", "Account");
{
     @Html.AntiForgeryToken()
     @Html.ActionLink("Log-Out", "LogOut", "Account")
}     

@using (Html.BeginForm("LogOut", "Account", FormMethod.Post, new { id = "logoutForm" })) {
        @Html.AntiForgeryToken()
        <a href="javascript:document.getElementById('logoutForm').submit()">Log off</a>
}

和控制器动作中的 [HttpGet] 到 [HttpPost]

于 2013-07-22T15:19:49.190 回答
0

尝试使用

<input type="submit" value="logout" />

@using(Html.BeginForm("LogOut", "Account")){ ... }

所以数据实际上会被提交给控制器。如果你想保留一个文本链接,你可以使用 jQuery 来提交 à la

@using(Html.BeginForm("LogOut", "Account", new {id= "myForm"})
{
    <a href="javascript:void(0)" id="logoutText">logout</a>
}

<script type="text/javascript">
$(function(){
    $('#logoutText').click(function(){
        $('#myForm').submit();
    });
});
</script>
于 2013-07-22T15:05:59.283 回答
0

首先,您甚至不需要呈现为超链接的ActionLink表单。

其次,您不应该为 get 方法验证AntiForgeryToken

只需更换

Html.BeginForm("LogOut", "Account");
{
  @Html.AntiForgeryToken()
  @Html.ActionLink("Log-Out", "LogOut", "Account")
}   

@Html.ActionLink("Log-Out", "LogOut", "Account")
于 2013-07-22T15:16:05.560 回答