我的登录工作正常,角色信息和一切都很好,但我不能得到令牌注销。
我的启动配置是这样的:
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将在下次刷新时被删除。
对不起,上面是一个脑子转储,只是想先避免任何问题
解决方法
如果要使服务器端的令牌无效,请向其中添加一个唯一的ID,并跟踪您的服务 – 您需要手动构建类似的内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。