3

OK 、ユーザー名の資格情報(およびX509証明書の暗号化)を使用したメッセージセキュリティを使用して、WCFサービスと通信しています。私はこのアプローチに満足していませんが、それは問題のポイントではなく、私はそれには入りたくありません。

Windsor Castleを使用して、 ASP NET Web Forms+MVCハイブリッドでプロキシを生成しています。フォーム認証を使用しており、ユーザーの資格情報を使用してWCFサービスと通信しています。これはすべての呼び出しの監査に役立ちます。私が言ったように、私はこのアプローチに満足していませんが、それはポイントではありません。

CustomCredentialsクラスを継承するクラスを作成しましたがAbstractCredentials、WcfFacilityはそれを使用してプロキシを構成します。以下に示すように、私のセットアップはすべてほんの数行です。以下にユニットテストを作成しました。これは、プロキシを作成し、呼び出しを行ってから、ループで解放するという、私が行っているすべてのことを示しています。今、私はこのテストが機能することを期待していますが、機能せず、

Expected: 10 But was: 1

バインディングは含まれていませんが、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
} 
4

2 に答える 2

1

キャッスル フォーラムに投稿しましたが、返信がありません。WCF ファシリティの設計上の問題であり、セキュリティなしでは問題ないがセキュリティでは機能しないサービス チャネルをキャッシュします。

于 2012-11-17T11:24:49.003 に答える
1

資格情報とIWcfEndpoint一般に (DefaultClientModel.On(...)呼び出しの結果である) は、コンテナーが構成されたときに 1 回だけ作成されます。毎回異なる資格情報を提供したい場合は、以下のようにそれらを動的に依存させる必要があります。

_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 の制限でもありません。

于 2013-02-26T16:28:30.923 に答える