Добавить аутентификацию в запрос к веб-службе REST? - PullRequest
2 голосов
/ 21 июля 2010

Я использую WCF REST Startkit для создания тестового веб-сервиса REST.Чтобы проверить это, я создаю простое консольное приложение с HTTPClient (поставляется в комплекте) и HttpResponseMessage, чтобы сделать запрос к службе REST.Вот несколько кодов:

HttpClient client = new HttpClient(argsParser.BaseAddress);
HttpResponseMessage resp = client.Get(argsParser.URI);
Console.WriteLine(@"READING DATA FROM {0}{1}", 
  argsParser.BaseAddress, 
  argsParser.URI.Length == 0 ? @"" : string.Format(@"/{0}", 
  argsParse.URI));
resp.EnsureStatusIsSuccessful();
string contentType = resp.Content.ContentType;
Console.WriteLine("CONTENT TYPE: {0}", contentType);
string content = resp.Content.ReadAsString();
Console.WriteLine(
@"CONTENT: {0}", content);

, где argsParser - мой класс анализатора аргументов для получения базового адреса и URI.Он работает нормально, как я уже говорил с моей службой REST в нашей интрасети.Однако, когда я использовал тестовое приложение с веб-службой REST, такой как служба Twitter REST, у меня возникли исключения.

Я думаю, что это вызвано настройками моей рабочей сети. BlueCode Безопасность была реализована как принудительное применение ко всем браузерам / http-запросам на работе.Я должен ввести свой user / pwd в окне подсказки, когда мой браузер обращается к веб-службе REST, как в первый раз в Twitter.После того, как я предоставил свою аутентификационную информацию, браузер работает нормально.

Так что я предполагаю, что с экземплярами HttpClient и HTTPResponseMessage, созданными в моем консольном приложении, мне может понадобиться добавить / присоединить к ним некоторую информацию аутентификации.Я не уверен, какие классы или API мне нужны для предоставления необходимой информации для аутентификации?

1 Ответ

2 голосов
/ 27 октября 2010

Чтобы предоставить учетные данные через заголовок авторизации с помощью HttpClient, который поставляется с стартовым комплектом WCF REST, используйте это:

1

 HttpClient client = new HttpClient();
 client.TransportSettings.Credentials = new NetworkCredential("user", "pass");

На стороне сервера вы можете извлечь их в RequestInterceptor или в пользовательском HttpModule, что также может помочь вам сделать обычную базовую аутентификацию с IIS ...

2.

Вы также можете добавить токен / ключ авторизации, например:

client.DefaultHeaders.Authorization = new Credential("18f34d01-blah-4959-blah-7db6ac5433cd");

ИЛИ вы также можете поместить токен в специальный заголовок следующим образом:

client.DefaultHeaders.Add("CustomAuthHeader", "18f34d01-blah-4959-blah-7db6ac5433cd");

На стороне сервера вы извлекаете этот конкретный заголовок ....

Вот как можно извлечь учетные данные службы из объекта сообщения:

    private string[] ExtractCredentials(Message reqMessage)
    {
        HttpRequestMessageProperty request =
            (HttpRequestMessageProperty)reqMessage.Properties[HttpRequestMessageProperty.Name];

        string authHeader = request.Headers["Authorization"];

        if (authHeader != null && authHeader.StartsWith("Basic"))
        {
            string encodedUserPass = authHeader.Substring(6).Trim();

            Encoding encoding = Encoding.GetEncoding("iso-8859-1");
            string userPass = encoding.GetString(Convert.FromBase64String(encodedUserPass));
            int separator = userPass.IndexOf(':');

            string[] credentials = new string[2];
            credentials[0] = userPass.Substring(0, separator);
            credentials[1] = userPass.Substring(separator + 1);

            return credentials;
        }

        return new string[] { };
    }
...