Доступ к базовому объекту Request(WebRequest или HTTPRequest) в WCF для дайджест-предварительной аутентификации

Мы выставляем объекты Entity через WCF Services. Для извлечения сущностей мы делаем несколько запросов через WCF, близких к 100 или более. Недавно мы переключились на дайджест-аутентификацию и заметили, что каждый запрос к серверу выдает 401. Это создает вдвое большую нагрузку на сервер, и, поскольку у нас очень большие "сообщения", это создаст дополнительную задержку трафика. Цель состоит в том, чтобы иметь только один вызов (401) от сервера, а остальные запросы должны включать в себя заголовок Auth, чтобы сервер не выдавал 401. Поскольку Digest является протоколом на основе запросов с истекающим одноразовым номером, даже если мы не можем полностью устранить 401, но, по крайней мере, избегать их при каждом запросе. Поскольку мы контролируем и сервер, и клиента, мы хотим отправлять заголовок Digest Auth, включенный в каждый запрос. Существует свойство предварительной проверки подлинности в прокси / клиенте веб-ссылки стиля веб-сервисов.NET 2.0 (который наследует SOAPHttpClientProtocol), которое позволяет включать заголовок Auth в запрос, но с клиентом веб-ссылки служб WCF (который использует ChannelFactory) нет. "т. Существует четкое различие в трафике Запрос / Ответ, когда это свойство установлено, а когда нет. Поскольку это Digest Authentication(НЕ Basic), я не могу добавить заголовок Auth вручную во время BeginRequest с ClientMessageInspector.

    NetworkCredential creds = new NetworkCredential("username", "pass", "domain");

    //using .NET 2.0 "Web Reference" Style client that uses inherits SoapHttpClientProtocol:
    webReferenceClient = new Service1();
    webReferenceClient.Credentials = creds;
    //**Pre Authenticate **
    webReferenceClient.PreAuthenticate = true;
    string resp1 = "";
    for (int i = 0; i < 3;i++) 
        resp1 = resp1 + webReferenceClient.SayHello("jack");

    //using WCF "Service Reference" Client that uses ChannelFactory
    serviceReferenceClient = new Service1Client();

    serviceReferenceClient.ClientCredentials.HttpDigest.ClientCredential = creds;
    serviceReferenceClient.ClientCredentials.HttpDigest.AllowedImpersonationLevel =          TokenImpersonationLevel.Impersonation;

    string resp="";
    for (var i = 0; i < 3;i++) 
        resp = resp + serviceReferenceClient.SayHello("jack");

Трассировка фиддлера с помощью веб-эталонного клиента в стиле.NET 2.0 с установленной предварительной аутентификацией Обратите внимание, что существует только один 401, а остальные запросы имеют заголовок Auth.

Предварительная проверка подлинности с помощью веб-ссылки в стиле.net2.0

Трассировка с помощью эталонного клиента WCF Style Service. Каждый запрос генерирует 401 с сервера:

Аутентифицировать каждый запрос Singe

Я вижу два варианта:

  1. Переключите наш клиентский код на использование веб-эталонного клиента в стиле.NET 2.0, это будет большой шаг, так как мы делаем некоторую пользовательскую обработку ошибок.
  2. Найдите способ получить доступ к объекту WebRequest или HTTPRequest WCF ChannelFactory и установить свойство PreAuthenticate. Как добраться до реального объекта WebRequest??

Есть ли другие варианты??

0 ответов

Другие вопросы по тегам