Wcf security 如何在WCF中正确使用DisplayInitializationUI来提示用户提供凭据,以便在不同域中验证和使用Web服务?

Wcf security 如何在WCF中正确使用DisplayInitializationUI来提示用户提供凭据,以便在不同域中验证和使用Web服务?,wcf-security,wcf-client,Wcf Security,Wcf Client,我有一个WPF客户端,它连接到一组WCF web服务。我们有一个开发、测试、卷和生产域,每个域的服务器上都有可用的服务。这些域没有信任关系 目标是让客户端连接到任何其他域的服务。如果客户端和服务器位于同一域上,则应发送默认网络凭据以进行身份验证/授权。如果服务器位于不同的域中,那么它应该向用户询问凭据,这与Internet Explorer在您访问具有集成安全设置的不同域上的站点时所做的非常相似 目前,我正在尝试通过在为我的服务创建ClientBase实例时设置DisplayInitializa

我有一个WPF客户端,它连接到一组WCF web服务。我们有一个开发、测试、卷和生产域,每个域的服务器上都有可用的服务。这些域没有信任关系

目标是让客户端连接到任何其他域的服务。如果客户端和服务器位于同一域上,则应发送默认网络凭据以进行身份验证/授权。如果服务器位于不同的域中,那么它应该向用户询问凭据,这与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();
ShowCredentialUI类实现IIInteractiveChannelInitializer。类的业务端是BegindPlayInitializationUI方法

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日志时,从未发送凭据。我怀疑我遗漏了一些重要的东西。是否有人成功地实现了类似的场景?有没有更简单的方法来实现这一点


谢谢你的阅读

作为一个有趣的问题,你解决过这个问题吗?他还在这里问qestion:
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();
}