C# 使用Windsor Castle和WcfFacility创建具有消息安全性和用户名凭据的WCF代理

C# 使用Windsor Castle和WcfFacility创建具有消息安全性和用户名凭据的WCF代理,c#,wcf,castle-windsor,ioc-container,wcffacility,C#,Wcf,Castle Windsor,Ioc Container,Wcffacility,好的,我们正在使用带有用户名凭据的消息安全性(和X509证书加密)与我们的WCF服务通信。我对这种方法不满意,但这不是问题的关键,我不想介入其中 我正在使用Windsor Castle在ASP NET Web表单+MVC hybrid中生成代理。我们正在使用表单身份验证,并使用用户凭据与WCF服务通信-这将有助于审核所有调用。正如我所说,我对这种方法不满意,但这不是重点 我已经创建了CustomCredentials类,该类继承了AbstractCredentials类,WcfFacility很

好的,我们正在使用带有用户名凭据的消息安全性(和X509证书加密)与我们的WCF服务通信。我对这种方法不满意,但这不是问题的关键,我不想介入其中

我正在使用Windsor CastleASP NET Web表单+MVC hybrid中生成代理。我们正在使用表单身份验证,并使用用户凭据与WCF服务通信-这将有助于审核所有调用。正如我所说,我对这种方法不满意,但这不是重点

我已经创建了
CustomCredentials
类,该类继承了
AbstractCredentials
类,WcfFacility很高兴地使用它来配置我的代理。正如您将在下面看到的,我所有的设置都只是几行。我在下面创建了单元测试,它演示了我所做的一切:创建一个代理,进行调用,然后在循环中释放它。现在我期待着这个测试能起作用,但它没有,我得到了答案

预期为:10,但实际为:1

我没有包括绑定,但这与此无关,因为我说过我正在使用X509证书的消息安全性

我知道,对于具有消息安全性的通道工厂,一旦打开,您就无法更改凭据。这是同一个问题吗

这是WcfFacility中的一个bug还是一个限制? 这是密码

[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
} 
[TestFixture]
公共级安全带
{
私人IWindsorContainer(集装箱);;
公共静态int NumberOfTimeCredentialsConfigured=0;
[设置]
公共作废设置()
{
_容器=新WindsorContainer().AddFacility();
组成部分
.对于()
.ActAs(默认客户端模型)
.On(WcfEndpoint.FromConfiguration(“FrameworkUsersService”))
.Credentials(新的CustomCredentials()))
(生活方式,短暂),;
}
[测试]
公共无效多重环氧测试()
{
const int Runs=10;
NumberOfTimeCredentialsConfigured=0;
for(int i=0;i
我在城堡论坛上发了帖子,没有回复。在WCF设施中,这是一个设计上的问题,在WCF设施中,它们缓存服务通道,这些通道没有安全性,但不具有安全性。

您的凭据和
IWcfEndpoint
通常(这是
DefaultClientModel.On(…)
调用的结果)在配置容器时只创建一次。如果每次都要提供不同的凭据,则需要使其成为动态依赖项,如下所示:

_container.Register(Component.For<IFrameworkUsers>()
    .AsWcfClient()
    .DependsOn(
        (k, d) => d["endpoint"] = 
            new DefaultClientModel(WcfEndpoint.FromConfiguration("FrameworkUsersService"))
                .Credentials(new CustomCredentials())
     )
    .LifeStyle.Transient);
\u container.Register(Component.For())
.AsWcfClient()
德彭森先生(
(k,d)=>d[“端点”]=
新的DefaultClientModel(WcfEndpoint.FromConfiguration(“FrameworkUsersService”))
.Credentials(新的CustomCredentials())
)
(生活方式,短暂),;
String
endpoint
这里是WcfFacility使用的依赖项的名称。我不确定具体在哪里,但它是在某个拦截器中解决的(您可以在lambda中设置断点并调试测试以查看调用堆栈)。我假设它与
AsWcfClient(IWcfEndpoint)
方法参数的名称相匹配


所以答案是否定的,这既不是错误,也不是WCF能力的限制。

你有没有找到解决这个问题的方法?我自己也遇到了完全相同的问题。@DamianPowell否:(我在castle论坛上发布了帖子,没有回复。这是WCF设施设计的一个问题,在WCF设施中,他们缓存服务频道,没有安全性,但不具备安全性。