【问题标题】:Tomcat, HTTP authentication, and Active DirectoryTomcat、HTTP 身份验证和 Active Directory
【发布时间】:2013-02-24 19:57:42
【问题描述】:

在我们的 Intranet 中,所有用户都从 Active Directory 域登录 Windows。我必须开发一个针对 Active Directory 对用户进行身份验证的解决方案,该解决方案在 Tomcat 中运行并适用于 Servlet 和 Axis2。

我已经能够使用基本的 JavaSE 手动验证身份验证。我还创建了一个测试 Servlet,它从 POST 接收登录名和密码并且它也经过身份验证,所以如果我使用 HTTPS,至少我可以使用这个丑陋的解决方案。

我认为 HTTP 身份验证是最好的方法,因为它是 HTTP 标准,适用于 Servlet 和 Axis2 以及浏览器和任何类型的 SOAP 客户端。

对于浏览器,期望的行为是浏览器将打开登录模式窗口,用户将输入登录名和密码,我从 Servlet 中检索它们并针对 AD 进行验证。对于 Axis2,客户端处理其设置 HTTP 标头的方式,我从 Axis2 用于创建 WebService 的类中检索它(如何做到这一点我不知道也没有搜索过......)并做同样的事情验证。

问题是我面临很多可能性,但无法让其中任何一种发挥作用。大多数教程使用conf/tomcat-users.xml 并且从不给我密码。其他人使用 NTLM 或 Kerberos,我已经尝试将 spnego 用于 Servlet,但它根本不起作用,并且不适用于 Axis2。我宁愿使用不需要第三方库的本机解决方案。

有什么建议可以从哪里开始吗?

【问题讨论】:

    标签: jakarta-ee authentication tomcat active-directory http-authentication


    【解决方案1】:

    您似乎不需要用户单点登录。在这种情况下,您不需要 NTLM 或 Kerberos。您只需要使用 Active Directory 进行服务器端身份验证。

    幸运的是,AD 将自己暴露为 LDAP,但有一些怪癖。请查看此答案: Configuring Tomcat to authenticate using Windows Active Directory

    如果您针对 AD 正确配置领域和容器 (Tomcat) 身份验证,则无需检索标头或编写任何代码来进行身份验证 - 容器 (Tomcat) 将为您完成。

    已编辑:

    Web XML 示例:

     <security-constraint>
      <web-resource-collection>
        <web-resource-name>Wildcard means whole app</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
      </web-resource-collection>
      <auth-constraint>
        <role-name>user</role-name>
      </auth-constraint>
     </security-constraint>
    
          <login-config>
              <auth-method>BASIC</auth-method>
              <realm-name>default</realm-name>
          </login-config>
            <security-role>
               <role-name>user</role-name>
           </security-role>
    

    【讨论】:

    • 感谢您的提示,但这并不能解决我的需求。如果我有用户名和密码,我已经能够通过 AD 进行身份验证。当然,如果它是由 Tomcat 或 spnego 之类的软件完成的,我可以使用 request.getRemoteUser() 会很棒,但我也很容易手动完成几行。我的问题是我需要用户名,经过身份验证,它在应用程序中用于处理权限。
    • 在 Servlet 中,如果我无法从 cookie 进行身份验证并且在请求标头中找不到登录名和密码,我可以轻松地设置自己的 HTTP 标头以向浏览器询问登录名和密码。这就是为什么我认为不值得配置 Tomcat 的原因。我需要的是学习如何从 Servlet 和生成 Axis2 WebService 的类中处理 HTTP 身份验证(我正在认真考虑只是为每个操作参数添加一个 auth bean 并在 HTTPS 中抛出 WebService,在这种情况下我需要配置 Tomcat 以强制使用 HTTPS)。
    • 在基本身份验证中,浏览器通过WWW-Authenticate 标头提示,响应在Authorization Basic : 标头中返回,其中包含Base64 中的ID 和密码。如果您想使用getRemoteUser,Web 应用程序必须指定和身份验证约束——我在答案中添加了一个 sn-p。除非您编写阀门,否则无法在 Tomcat 中以编程方式添加远程用户。
    【解决方案2】:

    在 Active Directory 环境中唯一合理的方法是仅使用 Kerberos。对用户最好的方法是 Kerberos。如果您使用的是 Tomcat 7,则您有内置支持。 Java 6 具备使其工作的一切。这就是我多年来一直在做的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多