10

Tengo dos servicios WCF RESTful: el servicio "general" es público y no tiene seguridad; el servicio "admin" pretendo usar autenticación básica sobre SSL. Esta es mi web.config lado del servidor:En WCF, para un enlace webHttpBinding, ¿cómo especifico credenciales en el lado del cliente web.config cuando el servidor está usando autenticación básica?

<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> 

En el lado del cliente, actualmente tengo código que se parece a esto:

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; 
} 

La pregunta es, ya que, obviamente, no quiero Hardware codificar toda esta información de configuración, ¿cómo debo proporcionarla en el web.config en el cliente? Para mí, es bastante claro que el elemento de enlace debe verse más o menos igual en el cliente que en el servidor. Sin embargo, ¿dónde indico las credenciales que están asignadas a WebChannelFactory?

Cualquier ayuda y/o idea será apreciada.

Gracias, Steve

Respuesta

7

No se puede poner esas credenciales (usuario y contraseña) en web.config y ha WCF leerlos desde allí. Esta es una de las pocas características en WCF que no se puede hacer en la configuración: tiene que establecer esas credenciales en su código.

Por supuesto, en su código, puede leerlos de, p. Ej. una tabla de base de datos, o una entrada de configuración en alguna parte, pero debe hacerlo usted mismo. WCF no se puede configurar para leer automágicamente esas configuraciones desde algún lugar.

+0

que explicaría por qué, después de buscar por todos lados, no he podido encontrar nada parecido a los elementos de nombre de usuario/contraseña en el esquema de configuración wcf - he he gracias por la información. es tan fácil poner estos valores en el elemento appSettings. –

Cuestiones relacionadas