使用Java中的kerberos票证获取广告组

使用Java中的kerberos票证获取广告组,java,ldap,single-sign-on,kerberos,Java,Ldap,Single Sign On,Kerberos,我正在获取具有以下代码的kerberos票证: String client = "com.sun.security.jgss.krb5.initiate"; LoginContext lc = new LoginContext(client, new CallbackHandler() { @Override public void handle(Callback[] arg0) throws IOException, UnsupportedCallbackException {

我正在获取具有以下代码的kerberos票证:

String client = "com.sun.security.jgss.krb5.initiate";

LoginContext lc = new LoginContext(client, new CallbackHandler() {

@Override
public void handle(Callback[] arg0) throws IOException, UnsupportedCallbackException {
                System.out.println("CB: " + arg0);
            }
        });

lc.login();

System.out.println("SUBJ: " + lc.getSubject());
这段代码运行良好,我得到一个显示我的用户ID的主题。我现在的问题是,我需要知道用户是否属于广告中的某个组。有什么方法可以从这里做到这一点吗


我看到过使用LDAP获取用户组的代码,但它需要使用用户/密码登录,我需要使用SSO方式进行登录。

您无法使用登录时获得的票证类型来实现这一点。问题是Windows PAC(包含组成员信息)位于票据的加密部分。只有域控制器知道如何解密初始票证

可以用服务票。 因此,您可以设置一个密钥表,使用jgss对自己进行身份验证,然后解密票据,找到PAC,解码PAC,然后处理SID。我在Java中找不到大部分的代码,尽管它在C中是可用的。 现在,您讨论的是编写或找到NDR解码器,阅读有关PAC和SID如何组合的所有规范,或者将C代码移植到Java。 我的建议是采取不同的方法。 相反,使用Kerberos登录LDAP。找到一个支持Java的LDAP库,您应该能够使用Kerberos票证登录

如果您的应用程序想要知道用户所属的组,以便填充菜单和类似的内容,您可以作为用户登录。 但是,如果要决定用户具有什么访问权限,请不要以用户身份登录以获得对LDAP的访问权限。问题是,使用Kerberos时,攻击者可以与用户合作,将整个基础结构模拟到应用程序中,除非您确认票据来自基础结构。 也就是说,因为用户知道他们的密码,而且这是应用程序知道的唯一秘密,所以用户可以与某人合作,假装是LDAP服务器,并声称拥有他们想要的任何访问权限

相反,您的应用程序在访问LDAP时应该有自己的帐户。如果你这样做了,你只需查找组列表。
我确实意识到这有点复杂。

Oracle对GSSContext的实现能够解密自动化数据字段。