Как установить прокси с учетными данными для сгенерированного клиента WCF?

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

Если я использую веб-службу, тогда можно установить прокси-сервер.

Ответ 1

Я не совсем уверен, что это то, что вы ищете, но здесь вы идете.

  MyClient client = new MyClient();
  client.ClientCredentials.UserName.UserName = "u";
  client.ClientCredentials.UserName.Password = "p";

Ответ 2

Я решил это, добавив пользователя Active Directory в пул приложений > Идентификация вместо сетевых сервисов. Этот пользователь также находится в группе, у которой есть разрешение на просмотр Интернета через прокси-сервер. Также добавьте этого пользователя в группу IIS_WPG на хост-сервере клиента.

В приведенном ниже коде первый бит аутентифицирует клиента с помощью службы WCF. Второй бит предположительно передает кривые на внутренний прокси-сервер, чтобы клиент вызывал службу WCF на сервере DMZ. Но я не думаю, что часть прокси-сервера работает. Я все равно оставляю код.

        // username token credentials
        var clientCredentials = new ClientCredentials();
        clientCredentials.UserName.UserName = ConfigurationManager.AppSettings["Client.Mpgs.Username"];
        clientCredentials.UserName.Password = ConfigurationManager.AppSettings["Client.Mpgs.Password"];
        proxy.ChannelFactory.Endpoint.Behaviors.Remove(typeof(ClientCredentials));
        proxy.ChannelFactory.Endpoint.Behaviors.Add(clientCredentials);

        // proxy credentials 
        //http://kennyw.com/indigo/143
        //http://blogs.msdn.com/b/stcheng/archive/2008/12/03/wcf-how-to-supply-dedicated-credentials-for-webproxy-authentication.aspx
        proxy.ChannelFactory.Credentials.Windows.ClientCredential = new System.Net.NetworkCredential
                                                                    (
                                                                        ConfigurationManager.AppSettings["Client.ProxyServer.Username"]
                                                                       , ConfigurationManager.AppSettings["Client.ProxyServer.Password"]
                                                                       , ConfigurationManager.AppSettings["Client.ProxyServer.DomainName"]
                                                                     );

В моем web.config я использовал следующее,

<system.net>
    <defaultProxy useDefaultCredentials="true">
        <proxy usesystemdefault="True" proxyaddress="http://proxyServer:8080/" bypassonlocal="False" autoDetect="False"  />     </defaultProxy>
</system.net>
<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_ITest" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
                <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
                <security mode="TransportWithMessageCredential">
                    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
                    <message clientCredentialType="UserName" negotiateServiceCredential="true" algorithmSuite="Default"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="https://wcfservice.organisation.com/test/test.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ITest" contract="Test.Test" name="WSHttpBinding_ITest"/>
    </client>
</system.serviceModel>

Вышеприведенный код работает с моей локальной машины. Когда я загружаю код в dev-сервер, он не работает. Я просмотрел журналы прокси-сервера, и он показывает ниже,

2011-06-14 05:21:10 2 11.11.11.11 - - authentication_failed DENIED "Организация/Финансы" - 407 TCP_DENIED CONNECT - tcp wcfservice.organisation.com 443/- - - 11.11.11.11 612 161 -

2011-06-14 05:21:10 6 11.11.11.152 ServerName $- policy_denied DENIED "Организация/Финансы" - 403 TCP_DENIED CONNECT - tcp wcfservice.organisation.com 443/- - - 11.11.11.205 185 361 -

Наш системный администратор DF добавил пользователя Active Directory в пул приложений > Идентификация вместо сетевых сервисов. Этот пользователь также находится в группе, у которой есть разрешение на просмотр Интернета через прокси-сервер. Также добавьте этого пользователя в группу IIS_WPG на хост-сервере клиента.

Это сработало для меня.

Ответ 3

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

    Dim client As ProductServiceClient = New ProductServiceClient("wsHttpProductService")
    client.ClientCredentials.UserName.UserName = "username"
    client.ClientCredentials.UserName.Password = "password"
    Dim ProductList As List(Of Product) = client.GetProducts()
    mView.Products = ProductList
    client.Close()