如何从另一个操作中注销
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;你做错了。 这目前在 UP 和 RUNNING 应用程序中使用,它绝对可以正常工作,与 POST 方法无关在这里,除非您想将其与 POST 方法一起使用。您可能需要对这个问题进行更多解释,因为它似乎有点模棱两可。 首先:您的注销操作应该是 POST(而不是 GET)。这是一般建议。第二:我不是在问如何进行注销操作……这是微不足道的。我的问题是如何从另一个动作重定向到注销动作... 请向我们解释一下,然后我们可以学习,为什么我们应该使用 POST 而不是 GET(为什么这对于一般建议很重要)?正如我在上面的代码中清楚地看到的那样,有一个从Logout
action 到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 方法中的代码相同。
【讨论】:
以上是关于如何从另一个操作中注销的主要内容,如果未能解决你的问题,请参考以下文章
如何从Mac从android studio中的fabric注销? [复制]