2009-12-18 30 views
10

Ho due servizi RESTful WCF: il servizio "generale" è pubblico e non ha alcuna sicurezza; il servizio "admin" che intendo utilizzare l'autenticazione di base su SSL. Questo è il mio web.config lato server:In WCF, per un webHttpBinding, come posso specificare le credenziali sul lato client web.config quando il server utilizza l'autenticazione di base?

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

Sul lato client, ho attualmente il codice che assomiglia a questo:

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 domanda è, dal momento che, ovviamente, non voglio hard- codificare tutte queste informazioni di configurazione, in che modo è necessario fornirle nel web.config sul client? È abbastanza chiaro per me che l'elemento di associazione deve apparire più o meno lo stesso sul client come sul server. Tuttavia, dove indico le credenziali che sono state assegnate a WebChannelFactory?

Qualsiasi aiuto e/o intuizione sarà apprezzato.

Grazie, Steve

risposta

7

Non si può mettere queste credenziali (username e password) in web.config e avete WCF leggerli da lì. Questa è una delle poche funzionalità di WCF che non possono essere eseguite in configurazione: è necessario impostare tali credenziali nel codice.

Naturalmente, nel codice, è possibile leggerli da es. una tabella di database, o una voce di configurazione da qualche parte - ma devi farlo tu stesso. WCF non può essere configurato per leggere automagicamente tali impostazioni da qualche parte.

+0

che spiegherebbe perché, dopo aver scavato dappertutto, non sono stato in grado di trovare nulla che somigliasse agli elementi username/password nello schema di configurazione wcf - egli ha grazie per le informazioni. è altrettanto facile mettere questi valori nell'elemento appSettings. –