2015-04-28 2 views
0

Хорошо, поэтому я пишу программу для доступа к службе RESTful, но сначала я должен предоставить аутентификацию на веб-сайте. У меня есть действительные учетные данные и весь мой код выглядит следующим образом:HttpWebRequest Аутентификация не работает

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Collections; 
using System.Net; 
using System.IO; 

namespace AccessAPI 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string uri = "http://domainName/"; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
      string auth = CreateAuthorization("http://domainName/", "my\\username", "password"); 
      request.Headers["Authorization"] = "Basic " + auth; 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      StreamReader reader = new StreamReader(response.GetResponseStream()); 
      Console.WriteLine(reader.ReadToEnd()); 
     } 

     static string CreateAuthorization(string realm, string userName, string password) 
     { 
      string auth = ((realm != null) && (realm.Length > 0) ? 
     realm + @"\" : "") + userName + ":" + password; 
      auth = Convert.ToBase64String(Encoding.Default.GetBytes(auth)); 
      return auth; 
     } 
    } 
} 

Я пришел далеко, используя некоторые из решений, размещенных на других форумах. Хотя это, казалось, сработало для некоторых людей, это не для меня. Во-первых, я знаю, что учетные данные являются точными. Я могу ввести их через веб-браузер, и они ведут себя так, как должны. Кроме того, я удостоверился, что любой «\» в них (есть один в имени пользователя) представлен «\\» в коде. Каждый раз, когда я запускаю это, я продолжаю возвращаться. «Удаленный сервер вернул ошибку: (401)« Неавторизованный ». Может ли кто-нибудь помочь мне устранить эту проблему? Спасибо за ваше время!

+0

Использует ли служба REST базовую аутентификацию? очень распространенная практика заключается в том, чтобы иметь ресурс с именем «login» или «auth» или что-то еще, передать ему учетные данные, получить токен авторизации, а затем использовать этот токен, вам нужно прочитать служебную документацию. Чтобы увидеть, какой механизм авторизации использует. – Gusman

ответ

0

Благодарим вас и Гусмана, и Прашанта, ваши комментарии помогли мне в правильном направлении и в конечном итоге добиться успеха. Итак, Гусман, вы были правы, это был не просто стандарт проверки подлинности, а использование службы IIS Window. Погуглить, как сделать это с HttpWebRequest привело меня к созданию этого:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Collections; 
using System.Net; 
using System.IO; 

namespace AccessAPI 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string uri = "http://domain.name/"; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
      request.Method = "GET"; 
      request.UseDefaultCredentials = false; 
      request.PreAuthenticate = true; 
      request.Credentials = new NetworkCredential("username", "password"); 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      StreamReader reader = new StreamReader(response.GetResponseStream()); 
      Console.WriteLine(reader.ReadToEnd()); 
     } 
    } 
} 

Теперь, почему это работает, пока другие попытки не сделал, я не знаю. Но суть всего этого, кажется, основано только на линии

request.Credentials = new NetworkCredential("username", "password"); 

Который, кстати, Prashant, работает, когда я не использую весь http://domain.name/, так же, как вы сказали. Ну, надеюсь, если у кого-то еще будет такая же проблема, они смогут найти эту тему и разобраться.

0

Из приведенного выше кода, когда «Auth» строка становится в составе строки аутентификации будет выглядеть следующим образом: «http://domainName/:my \ имя пользователя: пароль»

Строка аутентификации должна действительно иметь следующий формат: имя_домена \ имя пользователя: пароль (имя домена необязательно).

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