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

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

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

Я создал CustomCredentials класс, который наследует AbstractCredentials class и 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 ответа

Решение

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

Ваши полномочия и 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.

Другие вопросы по тегам