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... безрезультатно.

  1. Итак, есть ли у меня способ создать объект Credential, который можно прикрепить к этому каналу? О запросе учетных данных у пользователя, по-видимому, не может быть и речи.

  2. Или, возможно, есть параметр, который мне не хватает, который позволяет начальной авторизации (не уверен, является ли это токеном или каким-то кешированным набором учетных данных), чтобы не истекло время ожидания, пока приложение открыто?


РЕДАКТИРОВАТЬ 1:
Итак, я обнаружил, что если я перемещаю службу для загрузки клиентского приложения WPF на тот же сервер, что и служба WCF, прослушивающая вызовы, я никогда не сталкиваюсь с этой проблемой аутентификации после периода простоя (который, как я думаю, определяется параметром connectionTimeout в пределах IIS). Надеюсь, это всего лишь временная работа; он по-прежнему не решает актуальную проблему получения правильных учетных данных для службы.

Указывает ли это на проблему с выдачей себя за другое лицо?

0 ответов

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