Установить WCF ClientCredentials в App.config - PullRequest
10 голосов
/ 16 сентября 2010

Возможно ли установить clientcredentials для WCF в App.config?

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

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

  ...
End Using

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

Ответы [ 4 ]

13 голосов
/ 08 сентября 2011

Расширяя ответ Ладислава Мрнки, вы можете найти эту реализацию полезной:

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>
...
9 голосов
/ 04 апреля 2012

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

Расширяя далее Ответ Мормегила Вот как использовать реализацию customBehavior.

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

После чего вам нужно:

  1. Зарегистрировать поведение Extension.
  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>
8 голосов
/ 16 сентября 2010

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

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

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

4 голосов
/ 17 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...