Использование Windsor Castle и WcfFacility для создания прокси-серверов WCF с Message Security и учетными данными имени пользователя

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

Я использую Виндзорский замок для создания прокси в гибриде ASP NET 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
} 

person Aliostad    schedule 15.02.2011    source источник
comment
Вы когда-нибудь находили решение этой проблемы? Я сам сталкиваюсь с той же проблемой.   -  person Damian Powell    schedule 16.11.2012
comment
@DamianPowell нет :( Я разместил сообщение на форуме замка и не ответил. Это проблема, заложенная в WCF Facility, в которой они кэшируют каналы обслуживания, что нормально без безопасности, но не работает с безопасностью.   -  person Aliostad    schedule 17.11.2012


Ответы (2)


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

person Aliostad    schedule 17.11.2012

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

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

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

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

person Ivan Danilov    schedule 26.02.2013