当前位置: 首页 > 知识库问答 >
问题:

如何进行无状态(无会话)和无cookie身份验证?

娄利
2023-03-14
    null

一些重要注意事项:

  • 我们有传输安全性(HTTPS及其最好的朋友);
  • 在窗帘后面,web应用程序代表当前用户将大量操作委托给外部服务(这些系统确实将Bob识别为其用户之一)--这意味着我们必须将Bob的凭据转发给它们。

现在,我们如何(在每个请求上)对Bob进行身份验证?哪一种方法会是实施这样的事情的合理方法呢?

    null
    null

非常感谢您花时间阅读以下内容:)

共有1个答案

阴福
2023-03-14

啊,我喜欢这些问题--维持一个没有一个会话的会话。

在我的应用程序评估期间,我看到了多种方法来实现这一点。其中一种流行的方式就是您提到的打网球的方式--在每个请求中发送用户名和密码来验证用户。在我看来,这是不安全的,特别是如果应用程序不是单页的。它也是不可扩展的,特别是如果你想在以后的应用程序中添加认证之外的授权(虽然我想你也可以基于登录来构建一些东西)

一种流行的,虽然不是完全无状态的机制(假设您执行了JavaScript)是将会话cookie嵌入到JavaScript中。我的安全人员对此大喊大叫,但它实际上是可以工作的-每个请求都有x-authentication-token头或类似的东西,您将其映射到后端的数据库、内存中的文件存储等,以验证用户。此内标识的超时时间可以是您指定的任何时间,如果超时,用户必须重新登录。它具有相当高的可伸缩性--如果您将它存储在数据库中,它只执行一条SQL语句,并且有了正确的索引,即使同时有多个用户,它也只需要很少的时间就可以执行。不过,这里的负载测试肯定会有所帮助。如果我正确地理解了问题,这将是您的加密令牌机制-尽管,我强烈建议您使用一个加密随机令牌,比方说32个字符,而不是使用用户名+密码+其他任何东西的组合-这样,它是不可预测的,但您仍然可以将它与用户ID或其他东西相关联。

无论你最终使用哪一种,都要确保它安全地送到你手中。HTTPS在整个线路上保护您,但是如果您通过URL泄露会话令牌(或者更糟的是,通过URL泄露凭据),它就不保护您了。我建议使用一个头,或者如果不可行的话,每次都通过POST请求发送令牌(这意味着用户浏览器上有一个隐藏的表单字段)使用POST请求的后一种方法应该使用CSRF防御,以防万一,尽管我怀疑使用令牌本身可能是某种CSRF防御。

最后,但并非最不重要的是,确保您在后端有一些机制来清除过期的令牌。这在过去一直是许多应用程序的祸根--快速增长的身份验证令牌数据库似乎永远不会消失。如果您需要支持多个用户登录,请确保您或者限制数量,或者对每个令牌有更短的时间限制。正如我之前所说的,负载测试可能是对此的答案。

我还能想到一些其他的安全问题,但它们太宽泛了,在这个阶段无法解决--如果你把所有的使用(和滥用)案例都记在心里,你大概应该能够对这个系统做一个相当好的实现。

 类似资料:
  • 我正在构建一个API,并试图在多个上下文中解决身份验证问题。 API需要为我们创建和部署的客户端应用程序提供服务,并使用密码处理经过身份验证的请求。在每个请求中都发送密码并不是一个好主意,因此首先点击登录endpoint并获得会话ID更有意义。问题中的webapp是用AngularJS编写的,应该在localStorage中跟踪自己的会话,以减轻会话劫持并消除对cookie的依赖以跟踪会话。 we

  • 一切工作都很正常,只是随机/偶尔地,尽管用户登录了,会话超时发生,系统注销了用户,尽管令牌有7天的有效期。 所以我决定尝试使系统没有任何会话而无状态。为此,我使用了以下命令: 根据禁用主题状态会话存储 然而,现在我根本无法登录。我得到了 我还没有找到任何完整的会话少四郎的例子。对我的代码有什么建议让它工作吗??我一定是错过了什么,但我不知道是什么。 为什么禁用会话后MyRealm无法从Userna

  • 当应用程序依赖于无状态身份验证(使用类似HMAC的东西)时,是否有必要使用CSRF保护? 示例: > 我们有一个单页应用程序(否则我们必须在每个链接上添加令牌:。 此内标识将用于访问诸如之类的受限URL。 令牌将始终在HTTP头内传输。 没有Http会话,也没有cookie。

  • 我是EJB的新手,最近开始研究EJB(3.0)。我已经使用Java6年了,但以前从未使用过EJB。至少可以说,整个EJB业务的复杂性让我不知所措。我不明白我可以在哪里实际应用一些概念。 在理解无状态会话bean后,我想到的一个问题是,你能不能不要总是用一个没有本地成员的类的共享实例来替换无状态会话bean(实际上使其无状态)?我了解到正在为无状态会话bean进行实例池。如果没有状态,就不能简单地使

  • 需要一些帮助!!我对Drools中的有状态和无状态会话没有清晰的理解。我正在努力理解这一点,所以尝试了一个例子。 我在drools6.5版本上使用有状态和无状态会话测试了下面的drl,在这两种情况下都得到了相同的输出。根据我对无状态会话的理解,它应该只执行第一条规则,当应用程序对象在第一条规则中被修改时,第二条规则不应该被激活(“有效期”)。附加源代码。感谢您在这方面的帮助。