2010-09-14 5 views
1

Я пытаюсь подключиться к веб-службе, которая использует аутентификацию Kerberos для авторизации пользователя, но все, что я получаю, является несанкционированным 401 каждый раз, когда я пытаюсь выполнить запрос. Ниже приведен код, который я использую. Заранее благодарим за любую помощь, которую вы можете предоставить!ASP.NET HttpWebRequest с аутентификацией Kerberos

public XPathNavigator GSASearch(string url, string searchString) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + searchString); 
     request.CookieContainer = new CookieContainer(); 
     request.Credentials = CredentialCache.DefaultCredentials; 
     request.ContentType = "text/xml"; 
     request.Method = "POST"; 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     Stream receiveStream = response.GetResponseStream(); 

     XPathDocument doc = new XPathDocument(receiveStream); 
     return doc.CreateNavigator(); 
    } 

EDIT: Я чувствую, что должен объяснить немного больше того, что я пытаюсь сделать. Мне было поручено предоставить новый интерфейс для Google Search Appliance моей компании. Я использую страницу ASP.NET, которая делает некоторые вещи, например, выбрать коллекцию в зависимости от того, где находится пользователь и т. Д., А затем отправляет соответствующую строку поиска в GSA. Все это хорошо работало, пока они не решили включить аутентификацию, и теперь я не могу получить никаких результатов (я либо получил 401 неавторизованный, либо сообщение о том, что «Данные на корневом уровне недействительны»). Если я возьму строку поиска и предоставил ее непосредственно GSA, она будет аутентифицироваться отлично и отобразит результаты, я просто не могу получить ее через HttpWebRequest.

EDIT 2: Я немного поглядел (выполнил запрос через Fiddler), и похоже, что запрос только пытается вести переговоры, а не Kerberos. Я установил полномочия использовать Kerberos явно, как показано ниже, но это не помогло ...

public XPathNavigator GSASearch(string url, string searchString) 
    { 
     CredentialCache credCache = new CredentialCache(); 
     credCache.Add(new Uri(url), "Kerberos", CredentialCache.DefaultNetworkCredentials); 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + searchString); 
     request.CookieContainer = new CookieContainer(); 
     request.PreAuthenticate = true; 
     request.Credentials = credCache; 
     request.ContentType = "text/xml"; 
     request.Method = "POST"; 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     Stream receiveStream = response.GetResponseStream(); 

     //StreamReader readStream = new StreamReader(receiveStream); 

     XPathDocument doc = new XPathDocument(receiveStream); 
     return doc.CreateNavigator(); 
    } 

EDIT 3: Хорошо, приглядевшись опять же, CredentialCache.DefaultCredentials не кажется, есть свои сетевые учетные данные в это ...

+0

Вы не указали, где вы работаете с вашим клиентом. Это консольное приложение, приложение aspx и т. Д.? – feroze

+0

Извините ... это приложение aspx –

+0

Я предполагаю, что у вас нет настройки Active Directory правильно ... есть некоторые настройки доверия, которые необходимо установить между двумя серверами. –

ответ

0

1) Прошли ли вы проводку отслеживания успешной сессии в GSA с помощью браузера? Это работает?

2) Если # 1 работает, то какой заголовок WWW-Authenticate отправляется GSA по первому не прошедшему проверку подлинности запросу?

3) Является ли устройство, на котором приложение ASPX работает с частью того же домена AD, в котором находится GSA? AFAIK это, вероятно, требуется для успешного авторизации.

4) Далее, поскольку это приложение ASPX, выполняющее запрос, вы не можете использовать DefaultCredentials, потому что вам действительно нужны учетные данные пользователя, которому доверяет GSA. Для этого вы должны либо создать специальную учетную запись для приложения, разговаривающего с GSA, либо каждый пользователь будет доверенным пользователем в GSA и сначала выполните авторизацию страницы ASPX, затем передайте эти учетные данные в GDA с помощью делегирования , Для этого вам также понадобится сделать сервер, на котором работает приложение ASPX, доверенное для делегирования.

На мой взгляд, вы должны сначала создать свой код в консольном приложении, которое вы запускаете, и отлаживать. Затем переместите его на страницу ASPX. Таким образом, вы сможете узнать, вызвана ли ошибка хостом (ASPX vs console) или чем-то еще.

+0

Хорошо, просто обнаружил новую икоту при попытке выполнить шаг 1 с помощью скрипача ... ему нужно подключиться к ссылке https: //, а не http: //. Я попытался изменить свой URL-адрес подключения на https: //, но на самом деле это не повлияло (на самом деле, https: // url по-прежнему работает с неаутентифицированными вызовами GSA, поэтому я действительно сомневаюсь, что это проблема). Не уверен, что это повлияет на другие шаги, которые вы предоставили. –

+0

Использование скрипача, когда я делаю успешную попытку непосредственно из GSA, я не вижу WWW-Authenticate в информации заголовка. –

+0

На # 3, да, они находятся в одном домене. –

Смежные вопросы