Из-за этого вопроса поведение по умолчанию, когда не указано identity
, равно host/myhostname
.
Однако это кажется не совсем верным.
У меня есть служба SOAP WCF (это веб-служба Dynamics NAV, но это не должно иметь значения для следующего, поскольку вопрос полностью касается точки зрения клиента), которая не работает, если я не укажу какую-либо личность.
Сервер фактически работает под учетной записью пользователя домена. host/myhostname
указано, но не для этой учетной записи пользователя, а только для учетной записи компьютера. http/myhostname
указан для этой учетной записи пользователя домена.
Давайте рассмотрим три сценария:
Личность не указана
Я создаю EndpointAddress
со следующим кодом:
new EndpointAddress(new Uri(endpoint))
В этом сценарии происходит следующее:
- HTTP POST без заголовка
Authorization
. - Ответ с
WWW-Authenticate: Negotiate
. - HTTP POST с заголовком
Authorization: Negotiate XXX
.XXX
— это 1584 байта в кодировке BASE64, начиная с96 130 6
. Я не могу найти в нем читаемого ASCII. - Ответ с заголовком
Authorization: Negotiate XXX
.XXX
— это 126 байтов в кодировке BASE64. Я не могу найти в нем читаемого ASCII. - HTTP POST с заголовком
Authorization: Negotiate XXX
.XXX
— это 1527 байтов в кодировке BASE64. Я не могу найти в нем читаемого ASCII. - Ответ с заголовком
WWW-Authenticate: Negotiate XXX
.XXX
— это 113 байтов в кодировке BASE64. Я не могу найти в нем читаемого ASCII. - В этот момент клиент выдает исключение. Внутреннее сообщение об исключении —
The target principal name is incorrect
.
Вручную установите идентификатор host/myhostname
или неверную строку.
Я создаю EndpointAddress со следующим кодом:
var identity = EndpointIdentity.CreateSpnIdentity(@"host/myhostname");
var endpointAddress = new EndpointAddress(new Uri(endpoint), identity);
Если бы host/myhostname
было настройкой по умолчанию, приведенный выше код просто явно указывал бы эту настройку по умолчанию. Поэтому я ожидаю такого же поведения. Но это работает. Кажется, я возвращаюсь к NTLM. Так что должна быть разница.
Вот что происходит:
- HTTP POST без заголовка
Authorization
. - Ответ с
WWW-Authenticate: Negotiate
. - HTTP POST с
Authorization: Negotiate XXX
, где XXX — 40 байтов в кодировке BASE64. Первые байты — это буквы ASCIINTLMSSP
. - Ответ с
WWW-Authenticate: Negotiate XXX
, где XXX — 270 байтов в кодировке BASE64. Первые байты — это буквы ASCIINTLMSSP
. Также полное доменное имя, похоже, закодировано как ASCII. - HTTP POST с
Authorization: Negotiate XXX
, где XXX — 590 байтов в кодировке BASE64. На этот раз без букв ASCII. - Ответ с полезной нагрузкой.
Интересный факт: если я укажу идентификатор любой неправильной строки, у меня будет точно такое же поведение. Так, например, если я укажу EndpointAddress
с этим кодом:
var identity = EndpointIdentity.CreateSpnIdentity(@"thisIsTotallyWrongLoremIpsum");
var endpointAddress = new EndpointAddress(new Uri(endpoint), identity);
Я также получаю описанное выше поведение с откатом к NTLM.
Я правильно установил идентификатор http/myhostname
Теперь, когда я указываю SPN на http/myhostname
, который установлен и кажется правильным выбором из-за RFC 4559 это работает. Это конфигурация:
var identity = EndpointIdentity.CreateSpnIdentity(@"http/myhostname");
var endpointAddress = new EndpointAddress(new Uri(endpoint), identity);
И вот что происходит:
- HTTP POST без заголовка
Authorization
. - Ответ с
WWW-Authenticate: Negotiate
. - HTTP POST с заголовком
Authorization: Negotiate XXX
. XXX — это 1580 байтов в кодировке BASE64. Никаких знаков ASCI. - Ответ с полезной нагрузкой.
Этот вопрос не о том, чтобы заставить его работать, а о понимании. Что меня смущает, так это разница между первым и вторым примером. Мои мысли:
- Если идентификатор по умолчанию —
host/myhostname
, - не должно иметь никакого значения, чтобы вручную указать идентификатор для
host/myhostname
, - Но есть разница
- так что это не может быть идентификатором по умолчанию.
Итак, мои вопросы
- Каково фактическое поведение по умолчанию и
- почему
http/myhostname
не выбрано в качестве имени участника-службы по умолчанию, как должно быть, из-за RFC4559?
И/или я что-то совсем не так понял?
host/myhostname
в качестве удостоверения и указанием отсутствия. Таким образом,host/myhostname
не является поведением по умолчанию. Каково фактическое поведение по умолчанию? - person Lux   schedule 05.12.2016fiddler2
. К сожалению, я не могу раздавать бинарные пакеты, но если вы сообщите мне, какая информация может быть полезной, я буду рад их предоставить. Я благодарен за вашу помощь. Теперь вы можете следовать моему выводу, чтоhost/myhostname
не может быть идентификатором по умолчанию? - person Lux   schedule 05.12.2016host/myhostname
является SPN по умолчанию. Почему он возвращается к NTLM в № 2 и выдает исключения в № 1. Я бы ожидал прямо противоположного: если я укажу SPN, он никогда не должен вернуться к NTLM, но если я не укажу идентификатор, он может вернуться к NTLM. Однако; если вы напишете это как ответ, я соглашусь, если в ближайшие несколько дней не будет более подробной информации. - person Lux   schedule 08.12.2016http://foo.example.com:1234
ведет кhost/foo.example.com
как SPN. И когда имя участника-службы не существует, оно возвращается к NTLM, а когда имя участника-службы существует, но не для нужного пользователя, оно создает исключениеThe target principal name is incorrect
. - person Lux   schedule 08.12.2016