Развивая ответ Ладислава Mrnka, вы могли бы найти эту реализацию полезным:
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;
}
}
После чего вам необходимо зарегистрировать собственную реализацию, используя что-то вроде
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="UserNameClientCredentials" type="MyNamespace.UserNameClientCredentials, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
...
Спасибо. Но сохранение учетных данных в AppSettings по-прежнему потребует программных настроек. Я уверен, что это, вероятно, проблема с безопасностью, но я просто не вижу разницы: люди собираются хранить login/pw где-то в любом случае - почему бы не остаться там вместе с остальной конфигурацией WCF? :) –
Как вы сказали, это связано с безопасностью. Предоставление пользователю способа указывать пароль в открытом тексте является очевидным явлением безопасности. Теперь, если разработчик решит обходить его с предоставленным мной кодом, он будет знать о его неправильном действии. Он не сможет сказать «Эй, Microsoft, ваша вина, вы сказали, что все в порядке, чтобы поместить его в конфигурацию WCF». –