2010-09-16 21 views
9

¿Es posible establecer clientcredentials para un WCF en App.config?Establecer WCF ClientCredentials en App.config

me gustaría evitar hacer esto:

Using svc As New MyServiceClient 
    svc.ClientCredentials.UserName.UserName = "login" 
    svc.ClientCredentials.UserName.Password = "pw" 

    ... 
End Using 

Más bien, el nombre de usuario y contraseña debe ser parte de la configuración.

Respuesta

8

Hasta donde yo sé, eso no es posible usando la sección de configuración de ServiceModel debido al agujero de seguridad que crearía. Pero se podría crear appsettings regulares para estos valores y utilizarlos en código:

svc.ClientCredentials.UserName.UserName = ConfigurationManager.AppSettings("...") 

Yo aconsejaría contra de este enfoque, sin embargo, a menos que cifrar el archivo de configuración.

+1

Gracias. Pero almacenar las credenciales en AppSettings aún requerirá que establezca los valores mediante programación. Estoy seguro de que es probablemente un problema de seguridad, pero simplemente no veo la diferencia: la gente va a almacenar login/pw en algún lugar de todos modos, ¿por qué no allí junto con el resto de la configuración de WCF? :) –

+1

Como dijiste, está relacionado con la seguridad. Proporcionar al usuario una forma de especificar una contraseña en texto claro es un obvio agujero de seguridad. Ahora, si el desarrollador decide pasar por alto el código que proporcioné, se dará cuenta de su error. No podrá decir "Hola Microsoft, es tu culpa, dijiste que estaba bien ponerlo en la configuración de WCF". –

4

Puede intentar heredar ClientCredentialsElement (maneja la sección de configuración predeterminada) y agregar soporte para nombre de usuario y contraseña. De lo que puede registrar este elemento en el archivo de configuración como extensión de comportamiento y usarlo en lugar de la sección de configuración común.

12

Ampliando la respuesta de Ladislav Mrnka, puede encontrar esta aplicación útil:

public class UserNameClientCredentials : ClientCredentialsElement 
{ 
    private ConfigurationPropertyCollection properties; 

    public override Type BehaviorType 
    { 
     get { return typeof (ClientCredentials); } 
    } 

    /// <summary> 
    /// Username (required) 
    /// </summary> 
    public string UserName 
    { 
     get { return (string) base["userName"]; } 
     set { base["userName"] = value; } 
    } 

    /// <summary> 
    /// Password (optional) 
    /// </summary> 
    public string Password 
    { 
     get { return (string) base["password"]; } 
     set { base["password"] = value; } 
    } 

    protected override ConfigurationPropertyCollection Properties 
    { 
     get 
     { 
      if (properties == null) 
      { 
       ConfigurationPropertyCollection baseProps = base.Properties; 
       baseProps.Add(new ConfigurationProperty(
            "userName", 
            typeof (String), 
            null, 
            null, 
            new StringValidator(1), 
            ConfigurationPropertyOptions.IsRequired)); 
       baseProps.Add(new ConfigurationProperty(
            "password", 
            typeof (String), 
            "")); 
       properties = baseProps; 
      } 
      return properties; 
     } 
    } 

    protected override object CreateBehavior() 
    { 
     var creds = (ClientCredentials) base.CreateBehavior(); 
     creds.UserName.UserName = UserName; 
     if (Password != null) creds.UserName.Password = Password; 
     ApplyConfiguration(creds); 
     return creds; 
    } 
} 

Después de lo cual debe registrar esta implementación personalizada usando algo como

<system.serviceModel> 
    <extensions> 
    <behaviorExtensions> 
     <add name="UserNameClientCredentials" type="MyNamespace.UserNameClientCredentials, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </behaviorExtensions> 
    </extensions> 
... 
+0

Gracias, parece una implementación bastante ordenada. Lo intentaré algún día. :) –

8

Esto es lo que hice para conseguir la nueva autorización para trabajar

Ampliando más en Mormegil's answer esta es la forma de utilizar la implementación de behaviorBehavior.

public class UserNameClientCredentialsElement : ClientCredentialsElement 
{ // class renamed only to follow the configuration pattern 
    ... // using Mormegil's implementation 
} 

Después de lo cual es necesario:

  1. Registre el behaviorExtension.
  2. Define un nuevo behaviorConfig usando la extensión config. (que fue la parte difícil, la cobertura es escasa sobre cómo hacer esto.)
  3. Aplicar la configuración a un punto final.

usando algo como:

<system.serviceModel> 
    <client><!--(3)--> 
    <endpoint ...YourEndpointConfig... behaviorConfiguration="UserNamePasswordBehavior" /> 
    </client> 
    <behaviors><!--(2)--> 
    <endpointBehaviors> 
     <behavior name="UserNamePasswordBehavior"> 
     <userNameClientCredentials userName="skroob" password="12345" /> 
     <!--Visual Studio will give you warning squiggly on <userNameClientCredentials> 
      saying that "The element 'behavior' has invalid child element" 
      but will work at runtime.--> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
    <extensions><!--(1)--> 
    <behaviorExtensions> 
     <add name="userNameClientCredentials" type="MyNamespace.UserNameClientCredentialsElement, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </behaviorExtensions> 
    </extensions> 
    ... 
</system.serviceModel> 
Cuestiones relacionadas