Как указать прокси-классу WCF-клиента использовать проверку подлинности Windows и WindowsPrincipal уже вошедшего в систему пользователя домена в качестве учетных данных?

У меня есть клиент Windows WPF, который вызывает веб-сервис WCF. Пользователь уже вошел в домен Windows перед запуском приложения, а служба WCF использует проверку подлинности Windows.

Я хочу, чтобы клиент WPF использовал WindowsPrincipal уже вошедшего в систему пользователя при вызове службы WCF. Я НЕ хочу создавать новый экземпляр NetworkCredential с EXPLICIT именем пользователя и паролем, чтобы сделать это, просто потому, что просьба пользователя войти в систему дважды (в Windows и в приложении)... это довольно недружелюбно для пользователя.

Большинство примеров, которые я видел, используют этот способ для установки учетных данных, а это не то, что я хочу

serviceClientProxy.ClientCredentials.Windows.ClientCredential
= new NetworkCredential("username", "password", "domain");

Вместо этого я хотел бы сделать что-то вроде этого

serviceClientProxy.ClientCredentials.Windows.AllowedImpersonationLevel
    = TokenImpersonationLevel.Identification;
serviceClientProxy.ClientCredentials.Windows.ClientCredential
    = { /* network credential for already logged in user */ }

То есть я хочу NetworkCredential для уже существующих (и работающих)

new WindowsPrincipal(WindowsIdentity.GetCurrent())

Кто-нибудь знает, как это сделать? Я пытался установить security mode = "" и транспорт clientCredentialType = "" в app.config, но пока безрезультатно.

2 ответа

Решение

Две вещи. Убедитесь, что в вашей службе WCF разрешены учетные данные Windows. Как только вы подтвердите, что должны иметь возможность настроить клиент для использования типа учетных данных Windows. Пример (из MSDN) ниже.

WSHttpBinding myBinding = new WSHttpBinding();
myBinding.Security.Mode = SecurityMode.Message;
myBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;

В вашем app.config:

  • Добавлять:

    <system.net>
      <defaultProxy useDefaultCredentials="true"></defaultProxy>
    </system.net>
    
  • В вашей привязке в привязке элемента /security/transport установите proxyCredentialType="Ntlm"

Другие вопросы по тегам