2009-06-04 26 views
25

Tengo un servicio WCF usando BasicHttpBinding con autenticación de Windows. La mayoría de los clientes son cuentas de dominio y se conectan al servicio utilizando sus credenciales predeterminadas.Cómo especificar las credenciales de Windows en el archivo de configuración del cliente WCF

Ahora quiero conectarme al servicio desde un cliente ASP.NET que se ejecuta bajo una cuenta local. Deseo conectarme al servicio WCF utilizando las credenciales de Windows (dominio \ usuario y contraseña) que están disponibles para la aplicación ASP.NET.

Sé que puedo hacer esto en código usando ClientBase < T> .ClientCredentials.

¿Hay alguna manera de especificar las credenciales (dominio \ usuario y contraseña) en el archivo web.config del cliente para que no tenga que cambiar el código?

EDITAR

Si no se puede hacer en el archivo de configuración, hay una manera de utilizar System.Net.ICredentials o System.Net.NetworkCredential como una credencial para un servicio WCF?

.NET Framework proporciona estos como una forma homogénea de proporcionar credenciales de red, pero con WCF esto parece haber sido descartado a favor de un nuevo sistema incompatible basado en la clase System.ServiceModel.Description.ClientCredentials no relacionada.

EDIT 2

La aceptación de la respuesta de Marc a la pregunta original - parece que no hay manera de hacer esto en el archivo de configuración del cliente :(

me gustaría ver esto como una deficiencia en WCF - No acepto que Microsoft deba desalentarnos deliberadamente para que no agreguemos credenciales en el archivo de configuración; después de todo, tienen que estar almacenados en algún lugar, y el Framework incluye herramientas para cifrar el archivo de configuración. Creo que podría crear un BehaviorExtensionElement personalizado para este , pero debe estar disponible de fábrica.

También es un poco inconsistente: el elemento de configuración system.net/mailSettings/smtp/network permite especificar credenciales, ¿por qué no WCF?

En cuanto a la segunda pregunta acerca del uso de System.Net.NetworkCredential, parece this blog de que es posible, al menos cuando se utiliza la autenticación de Windows, con el siguiente código:

factory.Credentials.Windows.ClientCredential = 
    new System.Net.NetworkCredential(name, password, domain); 

Respuesta

11

No puede especificar su credenciales en el archivo de configuración, desafortunadamente, tiene que hacer esto en el código (lo más probable es que de lo contrario podría terminar con las credenciales en su archivo de configuración, en texto plano, no es algo bueno ...).

+3

"... en su archivo de configuración, en texto plano" no es generalmente una buena cosa, pero en el fichero de configuración de cifrado está bien. – Joe

+0

@marc_s ¿Todavía no está disponible para establecer a través de archivo de configuración? –

+1

@Johnny_D: no, hasta donde yo sé. –

0

¿Has probado esto?

<system.web> 
     <identity impersonate="true" userName="username" password="password"/> 
</system.web> 
+2

No, esto realmente no ayuda, el servidor ASP.NET no es confiable para la delegación. – Joe

4

entiendo que no hay un mecanismo para especificar las credenciales dentro de los <vinculantes> etiquetas, pero ¿por qué no hacer esto:

Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"]; 
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"]; 
+1

que funcionaría, pero recomiendo encriptar su archivo de configuración en este caso. –

+0

Sí, sé que puedo hacerlo en código, quiero evitar cambiar el código. – Joe

+0

Joe: mi ejemplo le permite luego especificar su nombre de usuario y contraseña en el archivo de aplicación/web.config ya que no puede hacerlo de forma nativa. – Lewis

18
Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"]; 
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"]; 

es incorrecto.Se usa con mensaje de seguridad y clientCredentialType = "UserName". Debe utilizar

Svc.ClientCredentials.Windows.ClientCredential = new NetworkCredential(...); 
+0

No hice su publicación completa. Usted ya sabe la respuesta a la pregunta, lo siento. – Steven

+0

Aunque esta es una pregunta muy antigua, la publico para cualquier persona con el mismo problema. – Steven

+7

Usted tampoco cumplió su sentencia completa;) – Gagege

1
Svc.ClientCredentials.Windows.ClientCredential = 
    System.Net.CredentialCache.DefaultNetworkCredentials; 
5

Parece que no hay manera de programar una ID y contraseña en la configuración de enlace por defecto (todavía estoy mirando), lo hice añadir el código de abajo, pero todavía desea que Microsoft agregarlo a los enlaces por omisión

<appSettings> 
    <add key="user" value="user" /> 
    <add key="password" value="password" /> 
    <add key="domain" value="domain" /> 
    </appSettings> 


    // client side code 
    string userName = ConfigurationManager.AppSettings.Get("user"); 
    string pswd = ConfigurationManager.AppSettings.Get("password"); 
    string domain = ConfigurationManager.AppSettings.Get("domain"); 

    client.ClientCredentials.Windows.ClientCredential.Domain = domain; 
    client.ClientCredentials.Windows.ClientCredential.UserName = userName; 
    client.ClientCredentials.Windows.ClientCredential.Password = pswd; 

Sebastián Castaldi

Cuestiones relacionadas