NTLM-аутентификация не проходит, но обычная аутентификация работает
Вот что происходит на локальном сервере, когда приложение вызывает HTTP-запрос на локальном IIS.
request.Credentials = CredentialCache.DefaultNetworkCredentials;
request.PreAuthenticate = true;
request.KeepAlive = true;
Когда я выполняю запрос, я вижу следующую серию HTTP-вызовов в Fiddler:
- Запрос без заголовка авторизации, результат 401 с WWW-Authenticate NTLM+Negotiate
- Запрос с авторизацией: согласование (Base64 строка 1), в результате 401 с WWW-Authenticate: согласование (Base64 строка 2)
- Запрос с авторизацией: согласование (строка 3 Base64), в результате 401 с WWW-Authenticate: согласование (строка 4 Base64)
- Запрос с авторизацией: согласование (Base64 строка 3), в результате 401 с WWW-Authenticate NTLM + согласование
По-видимому, клиент и сервер (оба работают на одной машине) пытаются квитировать рукопожатие, но в итоге авторизация завершается неудачно.
Странно то, что если я отключаю Windows-аутентификацию сайта и включаю обычную аутентификацию и явно отправляю user/pwd, все это работает. Это также работает, если я использую проверку подлинности NTLM и пытаюсь получить доступ к сайту из браузера, указав свои учетные данные.
1 ответ
Ну, после нескольких часов борьбы я понял, в чем проблема. Чтобы иметь возможность проверять сетевой трафик в Fiddler, я определил правило Fiddler:
if (oSession.HostnameIs ("MYAPP")) {oSession.host = "127.0.0.1"; }
Затем я использовал "MYAPP" вместо "localhost" в ссылке на веб-приложение, и Fiddler с радостью отобразил всю информацию о сеансе.
Но безопасность сервера была гораздо менее удачной, поэтому этот псевдоним в основном нарушил аутентификацию по запросу-ответу на локальном сервере. Как только я заменил псевдоним на localhost, все заработало.