当前位置: 首页 > 面试题库 >

Java SPNEGO身份验证和Kerberos约束委派(KCD)到后端服务

郑宏朗
2023-03-14
问题内容

我有一个Java Web应用程序,可以在Windows Active
Directory环境中对客户端进行SPNEGO身份验证。为了验证用户身份,我们使用了旧的SPNEGO SourceForge项目中的代码。

String encodedAuthToken = (String) credentials;
LOG.debug("Encoded auth token: " + encodedAuthToken);
byte[] authToken = B64Code.decode(encodedAuthToken);
GSSManager manager = GSSManager.getInstance();

try {
    Oid krb5Oid = new Oid("1.3.6.1.5.5.2");
    GSSName gssName = manager.createName(_targetName, null);
    GSSCredential serverCreds = manager.createCredential(gssName, GSSCredential.INDEFINITE_LIFETIME, krb5Oid, GSSCredential.INITIATE_AND_ACCEPT);
    GSSContext gContext = manager.createContext(serverCreds);

    if (gContext != null) { 
        while (!gContext.isEstablished()) {
            authToken = gContext.acceptSecContext(authToken, 0, authToken.length);
        }
        if (gContext.isEstablished()) {
            // Login succeeded!
            String clientName = gContext.getSrcName().toString();
        }
    }
}

身份验证效果很好,但是我们还需要使用受约束的委派将用户凭据委派给后端服务(Exchange
EWS)。在我们的广告中进行配置时,看起来差别很小,但不是。请参阅:
AD委托设置

此处描述了差异:msdn.microsoft.com/zh-
cn/library/cc246080.aspx?f=255&MSPPError=-2147217396使用不受约束的委托,我们可以在调用后端服务时简单地使用可用的委托凭据,并且它将一切都很好:

GSSCredential delegatedCreds = gContext.getDelegCred()
SpnegoHttpURLConnection conn = new SpnegoHttpURLConnection(clientCreds);

在受约束的委派下,我们无法访问用户TGT,并且似乎我们需要使用Java 8应该支持的MS-
SFU(S4U2proxy)Kerberos扩展。我能找到的唯一示例就是这个示例:https : //github.com/ymartin59/java-kerberos-
sfudemo(感谢Yves Martin!)

现在解决我的问题…验证之后,我基本上得到的是验证用户的用户名(请参见上面的代码中的“ clientName”)。

我们真的需要在这里使用S4U2self机制来模拟用户吗?客户端刚刚向我们发送了Kerberos服务票证(包装在我无法解码的SPNEGO令牌中)。理想情况下,我们应该能够使用该服务票证和我自己的服务的TGT来验证用户身份(使用S4U2proxy机制)?但是我不知道如何。

因此,现在我想知道是否可以将我们的SPNEGO身份验证与S4U2proxy委托结合在一起?

非常感谢您对此的任何投入。


问题答案:

实际上,我最近一直在做这样的事情,但是我正在使用spring security kerberos。我把一个例子在github
这里。我发现需要进行设置以使用像您希望的那样的约束委派和S4U2Proxy的关键是要确保(如果您使用的是Oracle /
OpenJDKisInitiator=true在JAAS
Config中进行设置,以便在调用getDelegCred时返回一个Krb5ProxyCredential。在这里查看评论。与凭证,你可以用它来对用户代表你被限制在正常的方式使用,如服务,创建服务票证令牌此。



 类似资料:
  • 我能够在没有用户的情况下使用Get access从Microsoft Graph访问资源。但是,这个方法不允许我访问需要委派权限的资源。 我还尝试使用代表用户获取访问权限方法,但它需要我的用户通过网页登录,这在我的方案中是不需要的。 是否可以生成一个使用寿命长(可能超过一年)的授权代码,并使用该代码请求访问令牌,然后使用该令牌获取需要授权权限的资源? 注意:我知道生成具有这么长生命周期的授权代码不

  • 我有一个这样的应用程序工作流程 (A) 用户代理(浏览器) 假设应用服务器(B)是一个SAML服务提供者,user@domain使用Web浏览器SSO配置文件从浏览器(A)到应用服务器(B)进行身份验证。 在(B)上运行的应用程序如何向user@domain.com的REST服务(C)进行身份验证?(假设B和C都是同一IdP上的SAML SP。) 如果浏览器只是对B和C进行AJAX调用,那么就很简

  • 我正在运行一个squid代理服务器(CentOS 5),我正试图通过我们的AD服务器(Windows server 2008)使用kerberos。 我遵循了以下说明:http://wiki.squid-cache.org/ConfigExamples/Authenticate/Kerberos 为服务器设置一个keytab,这一切都运行良好。 当我尝试从客户端PC使用代理时,会出现问题,它会立即

  • 我正在开发一个Web应用程序,它是rest客户端并使用rest服务(API)来执行任何操作。我集成了apache shiro以使用工作正常的jdbc领域执行身份验证。 现在,我正在寻找一种使用apacheDS LDAP执行身份验证的解决方案。我计划使用kerberos身份验证,但我没有找到任何有用的文章或示例来使用apache shiro实现kerberos身份验证。 我发现apache shir

  • 使用这个例子,我的连接几乎可以工作 http://blogs.nologin.es/rickyepoderi/index.php?/archives/105-oracle-driver-and-kerberos.html 我使用的是Java7,但使用另一个没有问题。有没有一种方法可以用jvm正确读取票证(参见jdk中的kinit不要创建正确的票证)

  • 任务:将Kerberos active directory身份验证添加到不安全的报告和数据操作桌面应用程序。此应用程序是。。。 用Stackless Python 2.7编写 使用Twisted进行客户端-服务器交互 客户端编译为exe并在Windows上运行 服务器在Linux(红帽)上运行 目前,我们从用户帐户中提取Windows网络ID(登录名)并传递到服务器,服务器会查找用户配置为具有的权