Аутентифицированный HttpWebRequest с перенаправлением, сохраняя учетные данные? - PullRequest
7 голосов
/ 29 мая 2009

Мое приложение ASP.NET 2.0 создает HTTPWebRequest для сайта в интрасети компании, который использует проверку подлинности NTLM. Переданные учетные данные относятся к учетной записи службы, которая успешно аутентифицирована в домене (журнал безопасности подтверждает это)

Ниже следует сокращенный код ..

HttpWebRequest req = WebRequest.Create(queryUrl) as HttpWebRequest;
NetworkCredential cred = new NetworkCredential(username,
                pwd, domain); 
req.Credentials = cred;

HttpWebResponse response = req.GetResponse() as HttpWebResponse;

Как часть запроса, есть пара перенаправлений (в пределах одного домена) к окончательному ответу - который обрабатывается ОК на моем компьютере разработчика (Windows 2k)

Когда этот запрос создается из моей среды развертывания (Windows 2k3), я получаю 401 несанкционированную ошибку, возвращаемую с сайта, по-видимому, после того, как возвращается первый код перенаправления (301 перемещено), и мой объект запроса пытается выполнить перенаправление .

Итак, кто-нибудь знает о каких-либо проблемах, связанных с проверенными запросами HttpWeb, которые следуют за перенаправлениями?

PS - Очевидный обходной путь - просто запросить страницу, перенаправленную на - но я, администраторы, отвечающие за сайт интрасети, хочу контролировать использование моего приложения, перенаправляя меня через определенную страницу.

Ответы [ 3 ]

12 голосов
/ 22 декабря 2010

Для HttpWebRequest для повторного использования учетных данных в перенаправлениях необходимо использовать кэш учетных данных. Если вы просто назначите объект NetworkCredentials, он будет использоваться только при первом запросе.

Вот пример:

HttpWebRequest req = WebRequest.Create(queryUrl) as HttpWebRequest;
NetworkCredential cred = new NetworkCredential(username, pwd, domain); 
var cache = new CredentialCache {{queryUrl, "Ntlm", cred}};
req.Credentials = cache;
HttpWebResponse response = req.GetResponse() as HttpWebResponse;
1 голос
/ 29 мая 2009

Это будет зависеть от того, как твоя авторизация. схема работает. Сетевые учетные данные помогут только для части NTLM if. Я подозреваю, что сайт, к которому вы пытаетесь получить доступ, также использует аутентификацию по формам. Если это так, то при входе в систему вы должны получить файл cookie авторизации, вам необходимо будет включить его в последующие запросы, например, после перенаправления. Я думаю, что объект WebRequest имеет коллекцию заголовков, которую вы можете использовать для хранения куки. Возможно, будет хорошей идеей использовать fiddler или firebug, чтобы увидеть, что встречается, когда вы обычно просматриваете.

0 голосов
/ 29 мая 2009

Если вы используете NTLM, это классическая проблема 2 скачка. Он работает на вашем компьютере разработчика, потому что клиент и сервер находятся в одном и том же окне, и учетные данные передаются не более одного раза (я предполагаю, что конечная целевая машина перенаправления)

При развертывании в среде prod задействовано 3 машины. Клиентский браузер передает учетные данные на server1, затем server1 пытается передать учетные данные на server2, что недопустимо. Обходной путь - внедрить аутентификацию Kerberos (более строгий протокол), которая позволит server1 передавать учетные данные на server2

...