3

我必须编写一个自定义的 Jaspic ServerAuthModule(它需要将专有的身份验证 Cookie 添加到 HTTP 响应和 HTTP 请求以传播到应用服务器上运行的应用程序)。身份验证必须使用 Kerberos、SPNEGO 完成。

要使用的应用服务器是 JBOSS EAP 6.4.x

我设法使用 JAAS Krb5LoginModule 获得身份验证。

我使用的 JBOSS EAP Standone.xml

  <security-domain name="host" cache-type="default">
    <authentication>
      <login-module code="com.sun.security.auth.module.Krb5LoginModule" flag="required">
          <module-option name="debug" value="true"/>
          <module-option name="principal" value="HTTP/macbookAirRCH@EXAMPLE.COM"/>
          <module-option name="storeKey" value="true"/>
          <module-option name="useKeyTab" value="true"/>
          <module-option name="doNotPrompt" value="true"/>
          <module-option name="keyTab" value="/Users/jet/Downloads/kerberos/macbookAirRCH.keytab"/>
      </login-module>
    </authentication>
  </security-domain>
  <security-domain name="SPNEGO" cache-type="default">
    <authentication>
      <login-module code="SPNEGO" flag="required">
          <module-option name="serverSecurityDomain" value="host"/>
      </login-module>
    </authentication>
    <mapping>
      <mapping-module code="SimpleRoles" type="role">
          <module-option name="user@EXAMPLE.COM" value="User,Admin"/>
      </mapping-module>
    </mapping>
  </security-domain>

jboss-web.xml

 <jboss-web>
   <security-domain>SPNEGO</security-domain>
   <valve>
       <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name>
   </valve>
   <context-root>kerberosREST</context-root>
 </jboss-web>

我还设法extends org.jboss.as.web.security.jaspi.modules.WebServerAuthModule使用以下配置使定制的 JASPI 模块正常工作():

<security-domain name="testDomain" cache-type="default">
   <authentication-jaspi>
      <login-module-stack name="lm-stack">
         <login-module code="SPNEGO" flag="required">
            <module-option name="serverSecurityDomain" value="host"/>
         </login-module>
      </login-module-stack>
      <auth-module code="ch.test.jaspic.CustomServerAuthModule" flag="required" login-module-stack-ref="lm-stack"/>
    </authentication-jaspi>
       <mapping>
          <mapping-module code="SimpleRoles" type="role">
             <module-option name="user@EXAMPLE.COM" value="User,Admin"/>
             </mapping-module>
          </mapping>
 </security-domain>

jboss-web.xml

<jboss-web>
   <security-domain>testDomain</security-domain>
   <valve>
       <class-name>org.jboss.as.web.security.jaspi.WebJASPIAuthenticator</class-name>
   </valve>
   <context-root>kerberosREST</context-root>
</jboss-web>

如何使用默认的 JAAS Krb5LoginModule?

我应该在 jboss-web.xml 中包含这两个阀门吗?(顺序很重要)

jboss-web.xml

<jboss-web>
   <security-domain>testDomain</security-domain>
   <valve>
       <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name>
   </valve>
   <valve>
       <class-name>org.jboss.as.web.security.jaspi.WebJASPIAuthenticator</class-name>
   </valve>
   <context-root>kerberosREST</context-root>
</jboss-web>

提前谢谢了

4

2 回答 2

3

根据我的(很少)理解,Valves 粗略地说,是一个较低级别的、特定于容器和容器范围的 ServletFilter对应物。因此,您尝试做的事情确实应该与Valve您问题中提出的管道(序列)一起使用。完成NegotiationAuthenticator实际身份验证后,最终由它WebJASPIAuthenticator委托ServerAuthModule的(SAM)将检查经过身份验证的调用者 Krb5Principal(或任何PrincipalJBoss 包装它的)是否已与前者的请求相关联,并相应地设置 cookie。

我想知道为什么您甚至愿意仅使用 JASPIC 来设置 cookie,而您可以使用简单的Filter代替(并摆脱一些特定于 JBoss 的配置作为奖励)。或者,如果您愿意放弃任何身份验证机制可移植性的痕迹,则可以尝试扩展NegotiationAuthenticator、覆盖其authenticate(...)方法并从那里设置 cookie,具体取决于对覆盖实现的委托的结果。

最后是适当的(尽管更难)供应商中立的方法,您可以在其中删除NegotiationAuthenticator并重新实现其作为 SAM 的功能。谁知道——开源的 SPNEGO SAM 甚至可能存在于某个地方。对于 Kerberos 身份验证,您可以根据 JASPIC 的LoginModule Bridge Profile(规范的第 6 章)委托给它来重用现有的Krb5LoginModule1 ——正如 dexter meyers所写的那样。s(LMs)当然不应该直接使用,而是通过s,这反过来又需要一些人来找到正确的 LM 并用它来初始化它。是否要重用 JBoss 的LoginModuleLoginContextConfigurationConfiguration(并因此保留各自的专有 XML),提供您自己的持久表示,或者只是在自定义LoginContext/中硬编码它Configuration是您的选择。

1理想情况下,您也可以重新实现 LM,也许在第二个 SAM 中,编排从单独的ServerAuthContext. 这样做会将与专有身份验证相关的配置减少到零,但代价是增加了复杂性和需要维护的代码。

于 2016-03-25T18:28:37.883 回答
3

要使用的应用服务器是 JBOSS EAP 6.4.x

不幸的是,JASPIC 在这个版本的 JBoss 上没有很好地实现。JBoss EAP 7 会很好,应该会在今年或明年初发布(如果一切顺利的话)(但没人知道,甚至 JBoss 的人也不知道)。EAP 7 有几个测试版,最新的一个叫做 JBoss WildFly 10,稍早一点的叫做 EAP 7 beta 1。

一般来说,有一个 JAAS 桥,您可以在其中让 JASPIC SAM 调用您的 JAAS 登录模块。您需要了解 JASPIC SAM 是身份验证机制,而 JAAS 登录模块是身份存储。

我很确定您不需要JAAS 登录模块的 JBoss 特定配置。只需要让 JBoss 内部代码(例如他们的 Servlet FORM 身份验证机制的实现)找到那个模块。

如果使用 JASPIC,则 SAM 处于控制之中。

有关网桥配置文件,请参阅本文了解更多信息:

https://blogs.oracle.com/nasradu8/entry/loginmodule_bridge_profile_jaspic_in

于 2016-03-25T11:21:33.010 回答