DefaultCredentials, похоже, не передает заполненный объект учетных данных в службу WCF через канал
У меня есть приложение WPF, которое запускается через браузер. При запуске все проходит проверку подлинности и приложение работает, как задумано. После некоторого времени простоя, когда приложение не находится в фокусе, кажется, что тайм-аут учетных данных и следующий вызов, открывающий канал, завершаются сбоем с кодом состояния 401.2, возвращенным службой, работающей в IIS.
Я обнаружил, что если переопределить ChannelFactory.Credentials.Windows.ClientCredentials
с новым NetworkCredential, жестко запрограммированным с моей учетной записью AD, он работает независимо от времени простоя. Поэтому я подумал, что я могу переопределить это с помощью DefaultCredentials/DefaultNetworkCredentials из CredentialCache при открытии канала, и учетные данные будут там, и все будут счастливы.
Похоже, что CredentialCache вообще не заполнен. Я знаю, что не смогу получить к ним доступ через непосредственное окно, но они, похоже, тоже ничего не передают через WCF.
Я считаю, что создание канала довольно стандартное. Код не работает после периода бездействия при первом обращении к сервису по новому каналу.
public ServiceFactory(string EndpointURL, string EndpointName)
: base(EndpointName)
{
this.Endpoint.Address = new EndpointAddress(EndpointURL);
this.Endpoint.Behaviors.Add(new MessageHeaderBehavior());
System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
this.Credentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials as NetworkCredential;
Конфигурация приложения использует HTTPS и проверку подлинности Windows, хотя я почти уверен, что здесь это не имеет значения, но вот эта информация на всякий случай.
<security mode="Transport">
<transport clientCredentialType="Windows" proxyCredentialType="Windows" realm="" />
<message clientCredentialType="Windows" algorithmSuite="Default" />
</security>
Я также попытался получить WindowsIdentity текущего пользователя и найти способ принудительно включить его в новый экземпляр NetworkCredentials... безрезультатно.
Итак, есть ли у меня способ создать объект Credential, который можно прикрепить к этому каналу? О запросе учетных данных у пользователя, по-видимому, не может быть и речи.
Или, возможно, есть параметр, который мне не хватает, который позволяет начальной авторизации (не уверен, является ли это токеном или каким-то кешированным набором учетных данных), чтобы не истекло время ожидания, пока приложение открыто?
РЕДАКТИРОВАТЬ 1:
Итак, я обнаружил, что если я перемещаю службу для загрузки клиентского приложения WPF на тот же сервер, что и служба WCF, прослушивающая вызовы, я никогда не сталкиваюсь с этой проблемой аутентификации после периода простоя (который, как я думаю, определяется параметром connectionTimeout в пределах IIS). Надеюсь, это всего лишь временная работа; он по-прежнему не решает актуальную проблему получения правильных учетных данных для службы.
Указывает ли это на проблему с выдачей себя за другое лицо?