如何从另一个操作中注销

Posted

技术标签:

【中文标题】如何从另一个操作中注销【英文标题】: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)。 【参考方案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 方法中的代码相同。

【讨论】:

以上是关于如何从另一个操作中注销的主要内容,如果未能解决你的问题,请参考以下文章

Angular 4在不使用服务的情况下从另一个组件执行功能

从另一个页面从 facebook ios sdk 注销用户

如何从不同的活动中注销G + plus sigin?

如何从Mac从android studio中的fabric注销? [复制]

如何使用 Parse Server 错误从另一个浏览器选项卡检测另一个会话正在进行中

如何从另一个选项卡上的场景切换或弹出选项卡式应用程序中第一个选项卡的第二个场景?