如何使asp.net身份验证注销功能生效?

3

我决定在我的网站中首次使用asp.net身份认证。我试图从我的视图创建一个简单的注销链接。当我点击这个链接时,我会得到一个错误 "Server Error in '/' Application. Requested URL: /Account/Logout"。此时我觉得代码是正确的,但显然出了点问题。任何帮助将不胜感激。

控制器:

// POST: /Account/Logout
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Logout()
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie, DefaultAuthenticationTypes.ExternalCookie);
    Session.Abandon();
    return RedirectToAction("Login", "Account");
}

首页视图:

<div id="sidebar-nav" class="sidebar">
    <div class="sidebar-scroll">
        <nav>
            <ul class="nav">
                <li><a href="@Url.Action("Index", "Home")" class="active"><i class="lnr lnr-home"></i> <span>Dashboard</span></a></li>
                <li>
                    <a href="#subPages" data-toggle="collapse" class="collapsed"><i class="lnr lnr-file-empty"></i> <span>Reports</span> <i class="icon-submenu lnr lnr-chevron-left"></i></a>
                    <div id="subPages" class="collapse ">
                        <ul class="nav">
                            <li><a href="@Url.Action("Index", "Home")" class="">Fulfillment</a></li>
                            <li><a href="@Url.Action("Index", "Home")" class="">Report</a></li>
                            <li><a href="@Url.Action("Index", "Home")" class="">Report</a></li>
                        </ul>
                    </div>
                </li>
                <li><a href="@Url.Action("Logout", "Account")" class=""><i class="lnr lnr-dice"></i> <span>Logout</span></a></li>
            </ul>
        </nav>
    </div>
</div>

当在索引视图中点击注销链接时,会返回上述错误。

预期结果是:该链接调用控制器中的Logout方法并重定向到登录页面。


2
我认为“注销”方法应该是Get而不是Post,使用“[HttpGet]”代替“[HttpPost]”。 - Aquib Iqbal
1个回答

3
由于您是通过点击链接来访问的,因此您应该将终端点属性设为 [HttpGet] ,而不是 [HttpPost] ,因为这是您正在发出的请求类型。
由于您正在使用 [ValidateAntiForgeryToken] 方法进行验证,因此还应向您的网站添加防伪令牌(适用于POST请求)。 如果您不想这样做(或进行GET请求时),请删除注释,否则请在表单中添加以下内容以生成一个: @Html.AntiForgeryToken() 这将渲染类似的输入: 有关AntiForgery令牌的更多信息,请单击此处。

我按照你的建议进行了更改,但出现了新的错误。所需的防伪表单字段“__RequestVerificationToken”不存在。 - SGekko
1
除非您确实要发送一个,否则请删除[ValidateAntiForgeryToken]。此令牌用于防止CSRF攻击,在这种情况下与注销链接无关,但我建议您阅读并学习有关此主题的知识。 - GregH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接