Заголовок авторизации отсутствует в запросе Http с использованием WCF - PullRequest
7 голосов
/ 02 ноября 2010

Я получаю доступ к веб-сервису, используя WCF.При использовании WSHttpBinding режим безопасности устанавливается как транспортный (https), а тип учетных данных клиента - базовый.Когда я пытаюсь получить доступ к сервису через прокси, я получаю 401 несанкционированное исключение.

Вот привязка

var binding = new WSHttpBinding()
        {
            UseDefaultWebProxy = true,
            Security =
            {
                Mode = SecurityMode.Transport,
                Transport =
                {
                    ClientCredentialType = HttpClientCredentialType.Basic,
                },
            }
        };

Вот вызов службы

var client = new InternetClient(binding, new EndpointAddress("httpsurl"));

        client.ClientCredentials.UserName.UserName = "username";
        client.ClientCredentials.UserName.Password = "password";
        client.ProcessMessage("somevalue");

При просмотре заголовков Http с помощью Http Analyzer CONNECT HEADER

(Строка запроса): CONNECT somehost.com:443 HTTP / 1.1
Хост: somehost.com
Прокси-соединение: Keep-Alive

POST HEADER

(Строка запроса): POST /Company/1.0 HTTP / 1.1
Тип содержимого: application / soap + xml;charset = utf-8
VsDebuggerCausalityData: uIDPo + voStemjalOv5LtRotFQ7UAAAAAUKLJpa755k6oRwto14BnuE2PDtYKxr9LhfqXFSOo8p * 10 **

Если вы видите, что заголовок авторизации отсутствует

Теперь мой вопрос: почему в вызове WCF отсутствует заголовок авторизации?Я что-то пропустил?,Пожалуйста, спросите, если вам нужна дополнительная информация

Ответы [ 4 ]

11 голосов
/ 05 июня 2013

Это распространенная проблема, но ситуация отличается от того, что вы думаете.

Оказывается, что изначально для 1-го запроса клиент WCF, настроенный на использование базовой аутентификации HTTP, тем не менее отправит запрос без необходимый заголовок авторизации на сервере.Это поведение по умолчанию класса HttpWebRequest, используемого клиентом WCF.

Обычно сервер веб-службы затем возвращает неавторизованный ответ HTTP 401 клиенту WCF, после чего последний отправляет сообщение с Заголовок авторизации.Это означает, что в обычных условиях для базовой HTTP-аутентификации будет происходить довольно бесполезная обратная связь с сервером.

Это также объясняет, почему заголовок отсутствовал в вашем прослушанном сообщении.Некоторые Http-сниффы, возможно, не передают ответ 401, поэтому весь обмен путается.

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

8 голосов
/ 21 октября 2014

В качестве незначительной модификации предыдущего ответа для поддержки асинхронных / ожидающих вызовов вы можете фактически создать новый OperationContext и передать его в любой поток, который вам нравится (если он не распределяется между параллельными потоками, посколькупотокобезопасный объект)

var client = new MyClient();
client.ClientCredentials.UserName.UserName = "username"; 
client.ClientCredentials.UserName.Password = "password";
var httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers[HttpRequestHeader.Authorization] = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(client.ClientCredentials.UserName.UserName + ":" + client.ClientCredentials.UserName.Password));

var context = new OperationContext(ormClient.InnerChannel);
using (new OperationContextScope(context))
{
    context.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
    return await client.SomeMethod();
}
1 голос
/ 13 марта 2014

Обратите внимание на Ожидание: 100-продолжить в заголовке.Вот причина получения туда-обратно.

Поместите это в ваш web.config и попробуйте снова:

<system.net>
    <settings>
      <servicePointManager expect100Continue="false"/>
    </settings>
</system.net>
0 голосов
/ 04 ноября 2010

На самом деле, я был не прав по этому вопросу. Я видел другое поведение при запуске HTTP-анализатора. Во время работы Http-анализатора мое приложение зависло после получения ответа 401. Когда приложение Http анализатор закрылось, приведенный выше код работал, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...