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>
...
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? :) –
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". –