我正在做一些研究,以期使用 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);
}
为了简洁起见,我省略了所有身份验证内容,但为了确认我正在使用外部承载设置令牌时。
在我的 UI 中,我将令牌存储在本地存储中(这里不涉及 cookie,这是一个经过深思熟虑的设计决策)。所以我有一个logout我的用户界面上的按钮Logout操作被命中并且代码运行良好。
但是,如果我随后在 API 上执行需要授权的操作,请求仍然会通过(即用户仍然经过身份验证,即使他们should已注销。
要么我错过了一些非常明显的东西(这不是第一次;-),要么这里发生了一些更基本的事情 - 最后我正在 ping @leastprivilege,因为我知道这是他们的领域。
任何帮助或见解将不胜感激。
我唯一能想到的是令牌在服务器/API 端是无状态的,因此不能过期或注销。
如果是这样的话,我想我可以:
a) 添加一个刷新令牌,该令牌创建一个在过去过期的新令牌 - 这是否有效? - 实际上取消它,它将发行一个新的令牌......旧的令牌仍然有效
b) 将不记名令牌存储在数据库中并每次检查,在注销时删除令牌(自然加盐、散列等)。然而,这只是让我们回到有状态服务器。
c)当有人明确注销时,我可以(并且将会)从本地存储中删除令牌,但是如果满足以下条件,令牌在技术上仍然有效a baddy可以拦截令牌。自然以上的一切就都结束了SSL无论如何,这应该会抑制坏人/坏女孩.
d) 也许这就是为什么很多人将承载令牌存储在 cookie 中(作为存储机制)的原因,因此一旦您注销,至少 cookie 将在下次刷新时被删除。
抱歉,上面的内容有点脑残,只是想先解决任何问题