需要注销时基本身份验证的替代方案是什么?

4
如果基本身份验证不能处理退出登录,有哪些备选身份验证方法可用于验证需要能够注销的后端服务?
我找到了这些参考资料,说明基本身份验证无法在没有某些hackiness的情况下进行注销: How to log out user from web site using BASIC authentication? How do I log out? 我们正在使用基本身份验证来登录后端应用程序,并使用FORM身份验证来登录前端应用程序。在我们的团队测试FireFox / IE上的堆栈后,发现如果用户通过这些浏览器中的基本身份验证登录到后端服务,则用户将无法注销。对于我的团队而言,这些黑客和解决方法是不可接受的(要求用户输入不正确的凭据,要求用户关闭浏览器,使用javascript发送不正确的凭据,要求用户清除浏览器缓存等),因此我们正在寻求有助于注销的替代身份验证方法。
编辑-我的临时解决方案,用于注销:
我目前通过使用表单身份验证来解决这个问题。一个问题是我的后端服务依赖于共享的前端login.html表单,另一个问题是Postman不支持通过重定向的FORM输入进行登录,而我们的客户Arquillian从login form中发出的调用会失败。 表单身份验证摆脱了“我无法使用BASIC注销”的问题,但现在我不能像以前那样直接进行身份验证。

如果多个后端服务依赖于共享的前端,则可以考虑会话共享。一些选项如hazelcast可供选择。您还可以探索JSON Web Token。 - Vikas Sachdeva
是的,我们已经通过应用服务器实现了会话共享。我们只需要一种更好的方式来发送我们的凭据,同时仍然能够注销。我们将不得不研究JWT。 - GuitarStrum
这提供了很多解决方法。为什么这些解决方法不可接受?你所要求的甚至是更大的解决方法,那么是什么使它可接受? - Piro
在这种情况下,注销时使会话失效就没有达到目的了吗? - Vikas Sachdeva
@Vikas 不行。尽管我们使会话无效,但基本身份验证将重新对用户进行身份验证,因为凭据存储在浏览器中,并且将创建新的会话。 - GuitarStrum
@Piro,我们的产品不允许依赖前端提供主要的安全操作,例如确保用户已注销。凭据必须有一种可靠的方式从浏览器中清除,而基本身份验证在各种浏览器中并不始终支持。此外,即使我们使用了解决方法,它们也无法在Safari中工作。 - GuitarStrum
2个回答

3

基于表单的身份验证

如果可以在服务器上保留会话状态,您可以选择使用基于表单的身份验证

在表单中发送凭据,如果凭据有效,则服务器将发出一个cookie,该cookie将来回发送以识别服务器上的会话。要注销,可以使会话失效:

session.invalidate();

您还可以配置应用程序以通过超时来使会话过期:
<session-config>
    <session-timeout>60</session-timeout> <!-- minutes -->
</session-config>

基于令牌的身份验证

如果您想要一个无状态机制,可以选择使用基于令牌的身份验证

客户端将硬凭据(如用户名和密码)交换为称为令牌的数据。对于每个请求,客户端将发送令牌而不是发送硬凭据给服务器进行身份验证和授权。

您可以使用JSON Web Token(JWT)来作为令牌。它是一种开放标准,定义了一种紧凑且自包含的方式,用于安全地在各方之间传输信息,作为一个JSON对象。

JWT是以下类型令牌的通用名称:

  • JSON Web Signature(JWS):有效载荷被编码并签名,因此可以验证声明的完整性。

  • JSON Web Encryption(JWE):有效载荷被加密,因此声明被隐藏不会被其他方看到。

该图像来自此页面

令牌可以在exp声明中定义过期日期。对于注销,您可以从客户端删除令牌。

您还可以在服务器端的白名单中跟踪令牌并根据需要使其无效。但是不必在服务器端存储整个令牌:仅在白名单中存储令牌标识符,并使用jti声明将令牌标识符存储在令牌中。


在基于令牌的身份验证中,当管理员封锁用户帐户并且用户必须立即注销时会发生什么? - jenil christo
@jenilchristo 如果您在服务器端跟踪令牌白名单并检查和验证令牌,则可以简单地从白名单中删除给定用户的令牌。 - cassiomolin
有没有其他的解决方案可以解决这个问题,而不需要将白名单或黑名单令牌存储到数据库中? - jenil christo
仅仅从客户端移除令牌来进行注销是否安全?攻击者在令牌过期之前仍然可以使用该令牌,对吗? - jenil christo
但是更改签名会使所有用户或令牌失效,对吗..? - jenil christo
显示剩余2条评论

0

我建议您查看Apache Shiro,特别是会话管理的方式(https://shiro.apache.org/session-management.html)。 他们将会话的概念抽象化,以便在各种情况下使用:在Web应用程序中(在这种情况下,它只是HTTP会话的包装器),在独立应用程序中等等...... 在您的特定情况下,前端可以打开和关闭(注销)与后端层共享的Shiro会话。

请看这句话:

异构客户端访问

(...)
For example, a (desktop) application could ‘see’ and ‘share’ the same physical session. We are unaware of any framework other than Shiro that can support this 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接