我正在做一些研究工作,以使用承载令牌作为身份验证机制(即AngularJS UI,通过OWIN在Web API [2]项目中进行身份验证)。
我的登录工作正常,角色信息和一切都很好,但我不能得到令牌注销。
我的启动配置是这样的:
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,这是一个故意的设计决定)。所以我在我的用户界面上有一个注销按钮,该注销操作被击中,代码运行正常。
但是,如果我随后在需要授权的API上执行了一项操作,则该请求仍然会被通过(即使用户仍然被认证,即使它们已被注销。
要么我错过了一些非常明显的事情(不会是第一次;-)或者还有一些更重要的事情在这里 – 最后我在ping @ @ @ @ @ @ @ @ @
任何帮助或见解将得到感激之情。
只有我能想到的是,该令牌在服务器/ API端是无状态的,因此不能过期或注销。
如果是这样,我想我可以:
a)添加一个刷新令牌,创建一个过去的过期的新令牌 – 这甚至可以工作吗? – 实际上取消了,它会发出一个新的令牌…旧的仍然是有效的
b)将承载令牌存储在数据库中并检查每次,在注销时删除令牌(自然盐化,散列等)。然而,这只是让我们回到拥有一个有状态的服务器。
c)当有人明确注销时,我可以(并将)从本地存储中删除令牌,但是如果一个恶意可以拦截该令牌,令牌仍然在技术上有效。以上所有这些都将超过SSL,这应该会阻止坏家伙/女孩。
d)也许这就是为什么很多人将承载令牌存储在cookie(作为存储机制)中,所以一旦您注销,最少cookie将在下次刷新时被删除。
对不起,上面是一个脑子转储,只是想先避免任何问题