Web API 2,OWIN身份验证,SignOut不会注销

时间:2014-07-03 11:25:41

标签: authentication asp.net-web-api owin asp.net-web-api2

我正在做一些研究工作,以便使用Bearer令牌作为身份验证机制(即AngularJS UI,通过Web API [2]项目中的OWIN进行身份验证)。

我的登录工作正常,角色信息和所有这些都没问题,但是我无法让令牌退出。

我的启动配置是:

OAuthOptions = new OAuthAuthorizationServerOptions() {
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AccessTokenExpireTimeSpan = SESSION_TIMEOUT,
    AllowInsecureHttp = true
};

我的退出操作就是这样:

public HttpResponseMessage Logout() {
    var authentication = HttpContext.Current.GetOwinContext().Authentication;
    authentication.SignOut(DefaultAuthenticationTypes.ExternalBearer);

    return new HttpResponseMessage(HttpStatusCode.OK);
}

为了简洁起见,我已将所有身份验证内容留下,但在设置令牌时确认我正在使用 ExternalBearer

在我的UI中,我将令牌存储在本地存储中(此处不涉及cookie,这是一个深思熟虑的设计决策)。所以我的UI上有一个注销按钮,注销操作被点击,代码运行正常。

但是,如果我随后点击了需要授权的API上的操作,则该请求仍然会通过(即,即使 已经注销,用户仍会进行身份验证。

要么我错过了一些非常明显的东西(不会是第一次;-)或者还有更基本的东西 - 最后我正在打@leastprivilege因为我知道这是他们的区域。

非常感谢任何帮助或见解。


我唯一能想到的是令牌在服务器/ API端是无状态的,因此无法过期或退出。

如果是这种情况,我想我可以:

a)添加一个刷新令牌,创建一个过去到期的新令牌 - 这甚至可以工作吗? - 实际取消它,它会发出一个新的令牌......旧的令牌仍然有效

b)将持有者令牌存储在数据库中并每次检查,在注销时删除令牌(自然盐渍,散列等)。然而,这只是让我们回到拥有状态服务器。

c)当有人明确注销时,我可以(并且将)从本地存储中删除令牌,但是如果 baddy 可以拦截令牌,则令牌在技术上仍然有效。当然,以上所有内容都将超过 SSL ,这应该会阻止坏人/女孩

d)也许这就是为什么许多人将持有者令牌存储在cookie中(作为存储机制),所以一旦你注销,cookie将在下次刷新时删除。

抱歉上面有点大脑转储,只是想先发制人问题

4 个答案:

答案 0 :(得分:37)

由于OAuth不是身份验证协议,因此没有注销概念。删除客户端上的访问令牌 - 这就是您所能做的一切。

如果您想在服务器端使令牌无效,请为其添加唯一ID并跟踪您的服务 - 您需要手动构建类似的内容。

答案 1 :(得分:16)

我在这里有一个漂亮的解决方案:http://www.nakov.com/blog/2014/12/22/webapi-owin-identity-custom-login-service/。基于OWIN和标准ASP.NET身份(Microsoft.AspNet.Identity.EntityFramework)的Web API OAuth承载令牌授权是自定义用户会话实现。它的工作方式与大多数人一样:

  • Web API会话在30分钟不活动后死亡。
  • 会话的生命周期在每个授权的HTTP请求中延长30分钟。
  • 注销工作正常:注销后,承载者access_token变为无效(已撤销)。

GitHub上提供了完整的工作源代码:https://github.com/SoftUni/SPA-with-AngularJS/tree/master/Ads-REST-Services

答案 2 :(得分:2)

这个问题已经存在了很长时间(也得到了回答),但我只是想在我的想法中说话。

我会做类似于你的(C)选项,但在持有人访问令牌上使用更短的到期时间,例如10或20分钟,这样当你在客户端注销并删除令牌时,虽然从技术上讲是令牌仍然有效,坏人将只有剩余的到期时间来玩你的有效令牌。

在实践中,我会将其与长期刷新令牌一起使用,这样我就可以获得新的持票令牌,如果它过期并希望继续与API资源交互,而无需再次进行身份验证。

答案 3 :(得分:1)

只要我知道持有人令牌存在于客户端,所以我不认为您需要服务器端"注销"功能。只需从客户端本地存储中删除令牌即可将您注销。