2010-09-16 4 views
9

Можно ли установить clientcredentials для WCF в App.config?Установить WCF ClientCredentials в App.config

Я хотел бы избежать этого:

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

    ... 
End Using 

Скорее логин и пароль должны быть частью конфигурации.

ответ

8

Насколько я знаю, это невозможно, используя раздел конфигурации serviceModel из-за отверстия безопасности, которое оно создало. Но вы можете создать регулярные AppSettings для этих значений и использовать их в коде:

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

Я бы посоветовал против такого подхода, хотя, если вы не зашифровать файл конфигурации.

+1

Спасибо. Но сохранение учетных данных в AppSettings по-прежнему потребует программных настроек. Я уверен, что это, вероятно, проблема с безопасностью, но я просто не вижу разницы: люди собираются хранить login/pw где-то в любом случае - почему бы не остаться там вместе с остальной конфигурацией WCF? :) –

+1

Как вы сказали, это связано с безопасностью. Предоставление пользователю способа указывать пароль в открытом тексте является очевидным явлением безопасности. Теперь, если разработчик решит обходить его с предоставленным мной кодом, он будет знать о его неправильном действии. Он не сможет сказать «Эй, Microsoft, ваша вина, вы сказали, что все в порядке, чтобы поместить его в конфигурацию WCF». –

4

Вы можете попытаться унаследовать ClientCredentialsElement (обрабатывает раздел конфигурации по умолчанию) и добавить поддержку для UserName и Password. Чем вы можете зарегистрировать этот элемент в файле конфигурации в качестве расширения поведения и использовать его вместо общего раздела конфигурации.

12

Развивая ответ Ладислава 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> 
... 
+0

Спасибо, это выглядит довольно аккуратно. Я попробую это когда-нибудь. :) –

8

Это то, что я сделал, чтобы получить новый auth для работы

Расширение далее на Mormegil's answer Это как использовать customBehavior.

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

После чего вам необходимо:

  1. Зарегистрируйте behaviorExtension.
  2. Определите новый элемент поведенияConfig, используя расширение config. (это была сложная часть, охвата недостаточно для того, чтобы сделать это.)
  3. Применить конфигурацию к конечной точке.

Используя что-то вроде:

<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> 
Смежные вопросы