Использование базовой аутентификации по SSL в Windows Phone 7 - PullRequest
3 голосов
/ 10 ноября 2010

Я знаю, что задавались варианты по этому вопросу, но я попробовал все предложенные решения безрезультатно.Мы пытаемся подключиться к службе WCF, которая использует базовую аутентификацию и безопасность транспорта (к сожалению, эти вещи нельзя изменить).Я не смог найти способ добавить наши учетные данные в TRANSPORT при вызове WCF;кажется, все решения заключаются в добавлении заголовков к сообщению.

Наша новейшая попытка - получить текстовый файл с сервера с помощью HttpWebClient, к которому прикреплены учетные данные, а затем выполнить вызов WCF;наша надежда на то, что аутентификация тогда ... Я не знаю, перейдите с HttpWebClient на клиент WCF (сгенерированный с помощью Service Reference).И хотя первый вызов работает, мы получаем сообщение CommunicationException при вызове WCF (и если я копаюсь в ответе, для параметра «Описание состояния» устанавливается значение «Неавторизовано»).

Есть ли способ, чтобы клиенты могли делитьсяавторизационный токен, который возвращается при успешной попытке?Это дурацкое поручение?Есть ли более простой способ сделать это, что я тоже должен ослепить?

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri("https://server/OGTE/api/WinPhone7.html"));

        request.Credentials = new NetworkCredential(_userName, _password, _domain);
        request.Method = "GET";

        request.BeginGetResponse((beginGetResponseResult) =>
        {
            try
            {
                HttpWebRequest requestWhileResponding = (HttpWebRequest)beginGetResponseResult.AsyncState;
                HttpWebResponse response = (HttpWebResponse)requestWhileResponding.EndGetResponse(beginGetResponseResult);

                try
                {
                    using (StreamReader streamReader1 = new StreamReader(response.GetResponseStream()))
                    {

                         string info = streamReader1.ReadToEnd();

                        Dispatcher.BeginInvoke(() =>
                                                   {
                                                       textblock.Text = info;
                                                   });

                    }

                    _userDataService.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(_userDataService_GetDataCompleted);
                    _userDataService.GetDataAsync("0C5696BB-2D15-4EA7-B198-5C12B3E23B63");

                }
                catch (Exception ex)
                {

                    Debug.WriteLine(ex.ToString());
                }

            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.ToString());
            }
        },

    request);
    }

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Другое решение, которое облегчит вашу жизнь при вызове служб REST, - это использование RestSharp .У них есть HttpBasicAuthenticator, и вы также можете создавать свои собственные аутентификаторы.Это также облегчает создание Uris для ресурсов REST.Вот сообщение в блоге о проверке подлинности с помощью службы WCF REST.Вы можете увидеть пример кода клиента, который использует RestSharp

1 голос
/ 07 декабря 2010

Для любопытных оказывается, что то, что я пытался выше, было совершенно ненужным.Оказывается, что заголовок авторизации МОЖЕТ быть установлен вручную, как было найдено в этой фантастической статье: http://cisforcoder.wordpress.com/2010/12/01/how-to-implement-basic-http-authentication-in-wcf-on-windows-phone-7/. Общая суть в том, чтобы получить текущий контекст и установить заголовок, как показано здесь:

var credentials = EncodeBasicAuthenticationCredentials("username", "password");

using (OperationContextScope scope =
      new OperationContextScope(service.InnerChannel))
{
    HttpRequestMessageProperty request = new HttpRequestMessageProperty();
    request.Headers[System.Net.HttpRequestHeader.Authorization] = 
        "Basic " + credentials;

    OperationContext.Current.OutgoingMessageProperties.Add(
                                 HttpRequestMessageProperty.Name, request);

    service.DoSomethingAsync();
}

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

...