Вопрос

После того, как спросил этот вопрос, Я пытался использовать 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>

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

Это было полезно?

Решение

Полный синтаксис для имени SPN выглядит следующим образом <service>/<user>@DOMAIN;по-видимому, доменное имя можно опустить.Однако, если имя пользователя является my-pc-name.domain-name, тогда вам не следует сокращать его дальше - предоставьте SPN точно так же , как spn -L перечисляет это вам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top