Как заставить NegotiateStream использовать Kerberos?
-
19-09-2019 - |
Вопрос
После того, как спросил этот вопрос, Я пытался использовать 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
перечисляет это вам.