Использование 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.