1

一連の WCF Web サービスに接続する WPF クライアントがあります。Dev、Test、Volume、Production ドメインがあり、各ドメインのサーバーでサービスを利用できます。ドメインには信頼関係がありません。

目標は、クライアントが他のドメインのサービスに接続できるようにすることです。クライアントとサーバーが同じドメインにある場合は、認証/承認のためにデフォルトのネットワーク資格情報を送信する必要があります。サーバーが別のドメインにある場合、統合セキュリティが設定された別のドメインのサイトにアクセスしたときに Internet Explorer が行うのとほぼ同じ方法で、ユーザーに資格情報を要求する必要があります。

現時点では、サービスの ClientBase のインスタンスを作成するときに DisplayInitializationUI() を設定して、クライアントの資格情報を取得しようとしています。

Client client = new Client(); // <- the wcf ClientBase implementation for the serivce.
client.Endpoint.Behaviors.Remove<ClientCredentials>();
client.Endpoint.Behaviors.Add<ClientCredentialsEx>();
client.DisplayInitializationUI();
client.InnerChannel.Open();

ClientCredentialsEx クラス。

public class ClientCredentialsEx : ClientCredentials
{
    public ClientCredentialsEx() : base() { }
    public ClientCredentialsEx(ClientCredentialsEx other) : base(other) { }

    public override void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime behavior)
    {
        behavior.InteractiveChannelInitializers.Add(new ShowCredentialUI());
        base.ApplyClientBehavior(serviceEndpoint, behavior);
    }
    protected override ClientCredentials CloneCore()
    {
        return new ClientCredentialsEx(this);
    }
}   

ShowCredentialUI クラスは、IInteractiveChannelInitializer を実装します。クラスのビジネス エンドは、BeginDisplayInitializationUI メソッドです。

public IAsyncResult BeginDisplayInitializationUI(IClientChannel channel, AsyncCallback callback, object state)
{
    string host = "";
    CREDUI_INFO info = new CREDUI_INFO();
    string username = string.Empty, password = string.Empty;

    CREDUI_FLAGS flags = CREDUI_FLAGS.GENERIC_CREDENTIALS |
                         CREDUI_FLAGS.SHOW_SAVE_CHECK_BOX |
                         CREDUI_FLAGS.EXPECT_CONFIRMATION;

    bool savePwd = false;

    // PromptForCredentials calls interop credui to challenge the user for username/password/smartcard.
    CredUIReturnCodes result = PromptForCredentials(ref info, host, 0, ref username,
                                                      ref password, ref savePwd, flags);


    ChannelParameterCollection collection = channel.GetProperty<ChannelParameterCollection>();
    collection.Add(new NetworkCredential(username, password));
    return new AsyncResult();
}

問題は、iis ログを調査すると、資格情報が送信されないことです。私は何か決定的なものを見逃しているのではないかと疑っています。同様のシナリオを正常に実装した人はいますか? これを達成する簡単な方法はありますか?

読んでくれてありがとう!

4

0 に答える 0