【发布时间】:2014-08-24 12:04:53
【问题描述】:
我正在做一些研究,以期使用 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 上有一个 logout 按钮,Logout 操作被点击并且代码运行良好。
但是,如果我随后在 API 上执行需要授权的操作,请求仍会通过(即,即使用户应该已注销,用户仍会通过身份验证。
要么我遗漏了一些非常明显的东西(不会是第一次;-),要么这里发生了一些更基本的事情 - 最后我正在 ping @leastprivilege,因为我知道这是他们的领域。
我们将不胜感激地收到任何帮助或见解。
我唯一能想到的是令牌在服务器/API 端是无状态的,因此不能过期或注销。
如果是这样的话,我想我可以:
a) 添加一个刷新令牌,该令牌创建一个在过去过期的新令牌 - 这甚至可以工作吗? - 实际上取消它,它会发出一个新令牌......旧令牌仍然有效
b) 将不记名令牌存储在数据库中并每次检查,在注销时删除令牌(自然加盐、散列等)。然而,这只是让我们回到拥有一个有状态的服务器。
c) 当有人明确注销时,我可以(并且将会)从本地存储中删除该令牌,但是如果 一个坏人 可以拦截该令牌,则该令牌在技术上仍然有效。当然,以上所有内容都会超过 SSL,这应该会抑制 坏人/坏人。
d) 也许这就是为什么很多人将 Bearer 令牌存储在 cookie 中(作为一种存储机制)的原因,因此一旦您注销,至少 cookie 将在下次刷新时被删除。
抱歉,以上内容有点脑残,只是想抢先提问
【问题讨论】:
-
如果您通过以下建议解决了问题,请添加您的代码。对于您在哪里添加唯一 ID 并启用 IncludeJwtId,我真的有点困惑
标签: authentication asp.net-web-api owin asp.net-web-api2