В WCF для webHttpBinding как указать учетные данные в клиентской части web.config, когда сервер использует базовую аутентификацию? - PullRequest
10 голосов
/ 18 декабря 2009

У меня есть две службы WCF RESTful - «общая» служба общедоступна и не имеет защиты; Служба «Администратор» Я намерен использовать базовую аутентификацию через SSL. Это мой серверный web.config:

<system.serviceModel>
    <bindings>
        <webHttpBinding>
            <binding name="general" maxReceivedMessageSize="2147483647">
                <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" />
                <security mode="None">
                    <transport clientCredentialType="None" />
                </security>
            </binding>
            <binding name="admin" maxReceivedMessageSize="2147483647">
                <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" />
                <security mode="Transport">
                    <transport clientCredentialType="Basic" />
                </security>
            </binding>
        </webHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior>
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            <behavior name="web">
                <webHttp/>
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <services>
        <service name="MyNamespace.AppServices.GeneralService">
            <endpoint address="" binding="webHttpBinding" contract="MyNamespace.Contracts.IGeneralService" behaviorConfiguration="web" bindingConfiguration="general" />
        </service>
        <service name="MyNamespace.AppServices.AdminService">
            <endpoint address="" binding="webHttpBinding" contract="MyNamespace.Contracts.IAdminService" behaviorConfiguration="web" bindingConfiguration="admin" />
        </service>
    </services>
</system.serviceModel>

На стороне клиента у меня есть код, который выглядит следующим образом:

private static IGeneralService GetGeneralChannel()
{
    WebHttpBinding binding = new WebHttpBinding();
    binding.Security.Mode = WebHttpSecurityMode.None;
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
    binding.MaxReceivedMessageSize = Int32.MaxValue;
    binding.ReaderQuotas.MaxStringContentLength = Int32.MaxValue;
    binding.ReaderQuotas.MaxArrayLength = Int32.MaxValue;

    WebChannelFactory<IGeneralService> cf = new WebChannelFactory<IGeneralService>(binding, new Uri("http://localhost:1066/GeneralService"));
    IGeneralService channel = cf.CreateChannel();
    return channel;
}

private static IAdminService GetAdminChannel()
{
    WebHttpBinding binding = new WebHttpBinding();
    binding.Security.Mode = WebHttpSecurityMode.Transport;
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
    binding.MaxReceivedMessageSize = Int32.MaxValue;
    binding.ReaderQuotas.MaxStringContentLength = Int32.MaxValue;
    binding.ReaderQuotas.MaxArrayLength = Int32.MaxValue;

    WebChannelFactory<IAdminService> cf = new WebChannelFactory<IAdminService>(binding, new Uri("http://localhost:1066/AdminService"));
    cf.Credentials.UserName.UserName = "myUserName";
    cf.Credentials.UserName.Password = "myPassword";

    IAdminService channel = cf.CreateChannel();
    return channel;
}

Вопрос в том, что, поскольку я, очевидно, не хочу жестко кодировать всю эту информацию о конфигурации, как мне предоставить ее в файле web.config на клиенте? Мне совершенно ясно, что элемент привязки должен выглядеть на клиенте почти так же, как на сервере. Однако где я могу указать учетные данные, которые назначены WebChannelFactory?

Любая помощь и / или понимание будут оценены.

Спасибо, Стив

1 Ответ

7 голосов
/ 18 декабря 2009

Вы не можете поместить эти учетные данные (имя пользователя и пароль) в web.config и сделать так, чтобы WCF прочитал их оттуда. Это одна из немногих функций в WCF, которую нельзя выполнить в конфигурации - вы должны установить эти учетные данные в своем коде.

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

...