【问题标题】:Rewriting inbound Java server authorization headers prior to authentication在身份验证之前重写入站 Java 服务器授权标头
【发布时间】:2011-06-28 17:51:23
【问题描述】:

我们有一个通过 Apache Tomcat 交付的 REST API,Flash Web 应用程序旨在与之通信。

身份验证是通过 SSL 上的基本身份验证执行的(尽管基本身份验证中的密码是 SHA-2 的)。问题在于,对 Flash 客户端使用基本身份验证会导致标准浏览器登录框出现,因为标题中有“WWW-Authentication: Basic”。 Flash 无法通过在请求之前手动设置 Authorization 标头来绕过此问题。

其他客户端需要能够通过现有机制进行身份验证,因此重写身份验证逻辑并不理想。

我的想法是,可以动态重写发送到 Flash 客户端和从 Flash 客户端接收的授权标头,以使用另一个名称作为基本身份验证,这将导致浏览器无法理解身份验证机制并且不显示对话框。可以将进出 Tomcat 的身份验证标头从“WWW-Authenticate: Basic”重写为“WWW-Authenticate: PretendBasic”,但理想情况下,内置容器安全性仍然可以在重写后处理基本身份验证。

我编写了一个过滤器,将入站标头重写为“WWW-Authenticate: PretendBasic”为“WWW-Authenticate: Basic”,希望下一个过滤器链是 auth 并且请求将被正常处理。不幸的是,Servlet 规范声明不能在身份验证之前插入过滤器。我认为这项工作的唯一可能性是创建一个可堆叠的 JAAS 身份验证模块,如果来自 Flash 客户端,它将首先对请求执行标头重写,然后将身份验证传递给现有的容器管理的安全系统。

由于我不熟悉 JAAS,我希望社区能够阐明如何实现这一点,以及这是否是一个好主意。

【问题讨论】:

    标签: java flash http tomcat jax-rs


    【解决方案1】:

    如果您的 Flash 应用程序始终使用受基本保护的服务器,它可以在生成对 Web 服务的第一个请求之前要求提供凭据。因此,第一个请求将已经包含身份验证标头,您将不会收到 401 响应。

    【讨论】:

    • 不,遗憾的是,不允许在 Flash 中明确设置授权标头。这是 Flash 播放器强制执行的安全限制。
    【解决方案2】:

    我原以为通过 WWW-Authenticate 启用身份验证,作为对 HTTP Basic 的模仿,就可以解决问题。

    如果您目前有 HTTP Basic 身份验证工作,只需添加另一个执行 HTTP Basic 但针对 WWW-Authenticate 标头而不是 Authorization 标头的身份验证器。

    然后您可以在 Flash 中包含标头并忽略该客户端中的 HTTP Basic。

    我在 Jetty 上使用 3 种不同的身份验证方案进行了类似操作。我不确定Tomcat的方式是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 2015-05-05
      • 2012-10-02
      • 1970-01-01
      相关资源
      最近更新 更多