Как заставить NegotiateStream использовать Kerberos?

Спросивэтот вопросЯ пытался использовать NegotiateStream для проверки подлинности клиента Windows на сервере Java. Кажется, что у Java нет отличной поддержки библиотеки NTLM, поэтому я работал над предположением, что мне придется использовать Kerberos, который Java, кажется, поддерживает намного лучше (через GSS-API).

Проблема в том, что NegotiateStream, кажется, пытается использовать NTLM каждый раз. Документация предполагает, что он может использовать либо, но не указывает, как он выбирает. Я не вижу никаких параметров в API, чтобы контролировать, какой механизм он выбирает. Есть ли способ?

У меня есть имя участника службы, и мой клиентский код выглядит так:

string spn = "<service-name>/<my-pc-name>"
TcpClient client = new TcpClient(server, port);
NetworkStream stream = client.GetStream();
NegotiateStream neg = new NegotiateStream(stream, true);
neg.AuthenticateAsClient(CredentialCache.DefaultNetworkCredentials, spn);

На стороне сервера первый набор полученных байтов - 22,1,0,0,59, а затем «NTLMSSP» - чего я не ожидал.

Я пробовал несколько разных форматов для строки SPN, не уверен, какой там правильный формат. Я изначально создал SPN с

setspn -A <service-name>/<my-pc-name>.<domain-name> <my-user-name>

setspn -L перечисляет это успешно как:

TEST/<my-pc-name>.<domain-name>

Я делаю что-то не так или совершенно неправильно понимаю это? :)

Ответы на вопрос(1)

Ваш ответ на вопрос