Java中的Web请求的Kerberos身份验证?

时间:2018-03-17 17:18:32

标签: java authentication kerberos

我正在尝试实现这一点:https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/lab/part6.html

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;

public class RunHttpSpnego {

    static final String kuser = "username"; // your account name
    static final String kpass = "password"; // your password for the account

    static class MyAuthenticator extends Authenticator {
        public PasswordAuthentication getPasswordAuthentication() {
            // I haven't checked getRequestingScheme() here, since for NTLM
            // and Negotiate, the usrname and password are all the same.
            System.err.println("Feeding username and password for "
               + getRequestingScheme());
            return (new PasswordAuthentication(kuser, kpass.toCharArray()));
        }
    }

    public static void main(String[] args) throws Exception {
        Authenticator.setDefault(new MyAuthenticator());
        URL url = new URL(args[0]);
        InputStream ins = url.openConnection().getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
        String str;
        while((str = reader.readLine()) != null)
            System.out.println(str);
    }
}

我已经减少了尝试执行示例代码段,但我不知道如何克服我面临的这个问题。 据我了解,此类请求的流程应如下所示,如本文档中所详述: 1.客户端向服务器发送HTTP GET请求 2.服务器使用HTTP 401和WWW Authenticate:Negotiate标头进行响应 3.然后客户端发送另一个HTTP GET请求,这次请求中有正确​​的Negotiate标头。

我的问题是,当我尝试运行该示例时,请求显然因IOException而失败,因为服务器使用401响应,然后我不知道如何使用标头发出第二个请求。我试图像基本身份验证一样添加标头,但在这种情况下,我不知道从哪里获取Negotiate值。 我做了一个数据包捕获,我可以看到从KDC请求的TGS票据,所以我认为那部分是可以的,我只是不知道它应该如何应用于我的请求。我使用连接到同一Web服务的其他脚本执行相同的数据包捕获,我可以看到与上面描述的完全相同的流程。

因此,总结一下我的问题:如何将身份验证标头添加到我的请求中?我是否需要在我的代码中明确地执行此操作,如果是这样,我该怎么做?

0 个答案:

没有答案