【问题标题】:WebAPI - Can it be used to Logout a user?WebAPI - 可以用来注销用户吗?
【发布时间】:2014-09-29 21:52:07
【问题描述】:

当从客户端通过 AJAX 调用在 WebAPI 控制器中调用此方法时,会返回 200 代码,但用户会在页面刷新时重新进行身份验证。我做错了什么?

    [HttpPost]
    [Route("logout")]
    public IHttpActionResult Logout() {
        AuthenticationManager.SignOut();
    }

这在标准 MVC 控制器中作为 ActionResult 和完整页面视图工作,但不能通过 AJAX 工作。

【问题讨论】:

  • 我不确定,但我猜测进行 AJAX 调用的 JS 正在使用 cookie 的副本,需要处理来自服务器的响应,然后更新/销毁客户端上的原始 cookie。
  • 可以添加响应状态码试试吗? Response.StatusCode = 303; AuthenticationManager.SignOut();
  • 附带说明,我建议您加入AntiForgeryToken 以防止出现CSRF 问题。
  • Rowan,我经常在示例中看到 AntiForgeryToken。 CSRF 真的是注销的问题吗?攻击者可以使用注销方法进行更险恶的事情吗?
  • @adam0101,没错,但客户端上的 cookie 似乎并没有消失。我已经尝试了一些东西,但接下来将尝试来自 Deepu 的 303 状态码。我可能会放弃并制作传统的页面导航类型的注销。

标签: ajax asp.net-mvc asp.net-web-api asp.net-mvc-5


【解决方案1】:

看起来您正在使用自定义的 AuthenticationManager 类,因为框架中内置的类看起来没有 SignOut 方法。

http://msdn.microsoft.com/en-us/library/system.net.authenticationmanager(v=vs.110).aspx

如果是这样,那么您的AuthenticationManager 类是否使用Session 来存储用户信息?因为 WebAPI 控制器对会话的访问类型与 MVC 控制器不同。 WebAPI 中的会话参考:

Accessing Session Using ASP.NET Web API

【讨论】:

  • 好奇!让我回顾一下我的来源。至少,能够在 API 中使用 Session 将是相当温文尔雅的。我假设使用 Session apply 的常见缺陷。
  • 因此,虽然我不会排除它,但我可能需要进行一些挖掘以查看在我的 Controller 中实现 IAuthenticationManager 的内容。我从现有的 OwinContext 中获取它。公共 IAuthenticationManager AuthenticationManager { 获取 { 返回 HttpContext.Current.GetOwinContext().Authentication; } }
  • 嗯,听起来很费劲,具体取决于您使用的框架。祝你好运!
  • 主要是香草 MVC。我实际上很困惑该属性的具体实现实际上来自哪里:D 我从durandalauth.azurewebsites.net 那里得到了一些指示,所以我猜它是他的东西的一部分。当我“搜索解决方案”时没有出现。
  • 原来你拥有的这个类是不同的来源。那是 System.Net.AuthenticationManager,它不继承或实现接口。我正在使用属于 Microsoft.Owin.Security 的 IAuthenticationManager。有一个称为的重载
猜你喜欢
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2013-10-28
  • 1970-01-01
相关资源
最近更新 更多