2009-09-30 2 views
4

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

Проблема в том, что 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> 

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

+0

Какую операционную систему вы используете? –

+0

Кроме того, что вы используете в качестве myServicePrincipalName? –

+0

Это работает на Vista64 прямо сейчас. Я немного запутался в правильном формате для myServicePrincipalName tbh - я пробовал несколько вариантов! Я создал SPN с этим: setspn -A TEST/. Я не уверен, что это так! : S Он зарегистрировал SPN, и я могу смотреть его с SPN -L <мой-User-Name> в котором перечислены TEST/. Учитывая, что я пытался «TEST/my-pc-name», «TEST/my-user-name» и оба из них с доменным именем на конце. Очевидно, что много догадок продолжается, я не нашел отличной документации :( –

ответ

3

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

+0

Ха, спасибо - это работает (только если я использую . доменное имя) таким образом, конкретно, строка, которая работает выглядит следующим образом:. TEST/ @ Я не думаю, чтобы попробовать эту комбинацию, как это выглядит так лишними, но я предполагаю, что это имеет смысл, это оленья кожа. Не работайте без @DOMAIN, и имя пользователя, похоже, также нуждается в доменном имени внутри него. Я завтра утром установлю вопрос, чтобы упомянуть материал SPN. Правильно ли я думаю, что Ne getiateStream использует Kerberos только в том случае, если задан действительный SPN, и просто не возвращается к NTLM, если нет? Спасибо за вашу помощь :) –

+0

Моя догадка заключается в том, что он пытается приобрести билет для службы из KDC. Если KDC не знает SPN, он не выдаст билет, а затем возвращается к NTLM (на самом деле не нужно «имя сервера»). –