【问题标题】:how to log-off from another action如何从另一个操作中注销
【发布时间】:2014-08-10 16:25:47
【问题描述】:

在 Microsoft ASP.NET MVC 5 中,

如何让用户退出帐户控制器的 LogOff 操作以外的操作?几年前我会使用 return RedirectToAction("LogOff","Account"),但现在它不再起作用了,因为 LogOff 是一个 Post 操作(不是 GET)。

public ActionResult SomeActionOfSomeController() {

 // some logic
 return RedirectToAction("LogOut", "Account"); //does not work since LogOut has HttpPost attribute

}

【问题讨论】:

  • 我想你正在寻找一些类似于 ASP.net mvc 中的 Server.Transfer 的东西。对吧?
  • 根据您的问题,GET 方法不再适用于 MVC 5!!,这是不对的。
  • 这个问题对于用户 dotnetstep 来说已经很清楚了,例如......没有断言明确表示“HttpGet 不起作用”。实际上,我的意思是 RedirectToAction("LogOff","Account") 不再起作用,因为 LogOff 是 Post 操作(不是 GET)。

标签: asp.net asp.net-mvc


【解决方案1】:

你可以这样做吗?

@using (Html.BeginForm("LogOff", "Account"))
{
        @Html.AntiForgeryToken()
        <button type="submit">Logout</button>
}

如果你想要一个链接而不是按钮,你可以这样做

@using (Html.BeginForm("LogOff", "Account",
        FormMethod.Post, new { id = "LogOffForm" }))
{
        @Html.AntiForgeryToken()
        <a href="@Url.Action("LogOff", "Account")"
            onclick="$('#LogOffForm').submit();">Logout</a>
}

【讨论】:

  • OP 询问如何从 MVC 控制器操作执行 LogOff,而不是如何从呈现的视图向 LogOff 提交请求。
【解决方案2】:

这就是我这样做的方式,它使用 GET 方法,这是你要求的吗?

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

        // instead of displaying logout page directly we redirect to confirmation page.
        // this will ensure auth cookie is cleared, which, in turn, ensures correct menu items are displayed

        return RedirectToAction("LogoutConfirm");
    }

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

【讨论】:

  • 这与我的问题无关......此外,LogOut Actions 应该是 HttpPost;你做错了。
  • 这目前在 UPRUNNING 应用程序中使用,它绝对可以正常工作,与 POST 方法无关在这里,除非您想将其与 POST 方法一起使用。您可能需要对这个问题进行更多解释,因为它似乎有点模棱两可。
  • 首先:您的注销操作应该是 POST(而不是 GET)。这是一般建议。第二:我不是在问如何进行注销操作……这是微不足道的。我的问题是如何从另一个动作重定向到注销动作...
  • 请向我们解释一下,然后我们可以学习,为什么我们应该使用 POST 而不是 GET(为什么这对于一般建议很重要)?正如我在上面的代码中清楚地看到的那样,有一个从Logoutaction 到LogoutConfirm 操作的重定向?
  • 那么你应该重新考虑你的主要问题,根据你的问题“但是现在它不再起作用了,因为 LogOff 是一个 Post 操作(不是 GET)” 这告诉人们HttpGet 在 MVC 5 上不再工作(过时)。你问问题时必须清楚。这并不意味着 GET 方法不再起作用
【解决方案3】:

您的 SomeActionOfSomeController 是否存在于 Account Controller 或其他一些控制器中?

如果它存在于 AccountController 中,那么您可以执行以下操作而不是调用 redicttoaction。

    public ActionResult Index2()
    {            
        return Index3();
    }

    [HttpPost]
    public ActionResult Index3()
    {
        return Content("Test");
    }

如果它来自其他控制器动作,那么你必须创建 AccountController 的对象,然后调用方法。

希望这会对你有所帮助。

【讨论】:

  • 它在另一个控制器上。我认为创建 AccountController 的对象很难看,但它确实解决了我的问题。
  • 我知道,但如果这件事对你来说是个噱头,那么找点工作就好了。
【解决方案4】:

假设您正在实现默认的 ASP.net 登录/注销,您可以将以下代码粘贴到您的控制器中。

AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
return RedirectToAction("Index", "Home");

注意:这两行代码与 Account/Logoff Controller Action 方法中的代码相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2013-01-26
    • 2017-02-02
    • 1970-01-01
    • 2012-07-31
    • 2017-11-07
    相关资源
    最近更新 更多