Использование Windsor Castle и WcfFacility для создания прокси WCF с защитой сообщений и учетными данными пользователя - PullRequest
3 голосов
/ 15 февраля 2011

ОК, мы используем безопасность сообщений с учетными данными имени пользователя (и шифрование сертификата X509) для связи с нашей службой WCF.Я не доволен этим подходом, но это не вопрос, и я не хочу вдаваться в подробности.

Я использую Виндзорский замок для генерации прокси в ASPNET Web Forms + MVC гибрид .Мы используем проверку подлинности с помощью форм и используем учетные данные пользователя для связи со службами WCF - это поможет контролировать все вызовы.Как я уже сказал, я не доволен этим подходом, но это не главное.

Я создал класс CustomCredentials, который наследует класс AbstractCredentials, и WcfFacility с радостью использует его для настройки моих прокси.Как вы увидите ниже, все мои настройки - всего несколько строк.Ниже я создал модульный тест, который демонстрирует все, что я делаю: создаю прокси, звоню и затем освобождаю его в цикле.Теперь я ожидаю, что этот тест будет работать, но он не работает, и я получаю

Expected: 10 But was: 1

Я не включил привязку, но это не имеет значения, так как я сказал, что использую Message Security с X509сертификаты.

Я знаю, что для фабрики каналов с безопасностью сообщений после открытия вы не можете изменить учетные данные.Это та же проблема?

Это ошибка в WcfFacility или ограничение?

Вот код

[TestFixture]
public class Harness
{

    private IWindsorContainer _container;
    public static int NumberOfTimesCredentialsConfigured = 0;

    [SetUp]
    public void Setup()
    {
        _container = new WindsorContainer().AddFacility<WcfFacility>();

    Component
        .For<IFrameworkUsers>()
        .ActAs(DefaultClientModel
        .On(WcfEndpoint.FromConfiguration("FrameworkUsersService"))
        .Credentials(new CustomCredentials()))
        .LifeStyle.Transient);
    }

    [Test]
    public void MultipleProxyTest()
    {

        const int Runs = 10;
        NumberOfTimesCredentialsConfigured = 0;
        for (int i = 0; i < Runs; i++)
        {
            IFrameworkUsers frameworkUsers = _container.Resolve<IFrameworkUsers>();
            frameworkUsers.CreateUserSession();
            _container.Release(frameworkUsers);
        }

        Assert.AreEqual(Runs, NumberOfTimesCredentialsConfigured);
                    // FAILS!!! Expected: 10  But was:  1
    }

    [TearDown]
    public void TearDown()
    {

    }


}

public class CustomCredentials : AbstractCredentials
{


    #region Overrides of AbstractCredentials

    protected override void ConfigureCredentials(ClientCredentials credentials)
    {
        credentials.UserName.UserName = "testuser";
        credentials.UserName.Password = "abcdef";

        Harness.NumberOfTimesCredentialsConfigured++;
    }

    #endregion
} 

Ответы [ 2 ]

1 голос
/ 17 ноября 2012

Я выложил на замке форум и не ответил.Это проблема по проекту в средстве WCF, в котором они кэшируют служебные каналы, что нормально без защиты, но не работает с безопасностью.

0 голосов
/ 26 февраля 2013

Ваши учетные данные и IWcfEndpoint в целом (что является результатом вызова DefaultClientModel.On(...)) создаются только один раз при настройке контейнера. Если вы хотите каждый раз указывать разные учетные данные - вам нужно сделать их динамическими зависимостями, как показано ниже:

_container.Register(Component.For<IFrameworkUsers>()
    .AsWcfClient()
    .DependsOn(
        (k, d) => d["endpoint"] = 
            new DefaultClientModel(WcfEndpoint.FromConfiguration("FrameworkUsersService"))
                .Credentials(new CustomCredentials())
     )
    .LifeStyle.Transient);

String endpoint здесь - имя зависимости, используемой WcfFacility. Я не уверен, где именно, но это разрешается в некотором перехватчике (вы можете установить точку останова в лямбде и отладить свой тест, чтобы посмотреть на стек вызовов). Я предполагаю, что он соответствует имени AsWcfClient(IWcfEndpoint endpoint) аргумента метода.

Так что ответ - нет, это не ошибка и не ограничение WcfFacility.

...