Почему CredentialCache.DefaultCredential содержит пустые строки для домена, имени пользователя и пароля

Есть ли у кого-нибудь идеи относительно того, почему CredentialCache.DefaultCredential возвращает экземпляр ICredential с пустыми строками для домена, имени пользователя и пароля? Я использую службу WCF на IIS 7.5. На одном сервере работает нормально, а на другом нет. Я проверил, что в приложении IIS включена проверка подлинности Windows....

Вот как это используется:

string url = string.Format("{0}/departments/finance/_vti_bin/listdata.svc", _IntranetAddress);
var financeDataContext = new FinanceDataContext(new Uri(url))
{
    Credentials = CredentialCache.DefaultCredentials
};

person devlife    schedule 02.10.2011    source источник


Ответы (2)


NetworkCredential, возвращаемый из CredentialCache.DefaultCredential, является просто заполнителем. Если вы посмотрите на него с помощью отладчика, вы увидите, что он имеет тип SystemNetworkCredential. Внутренняя проверка API для этого типа, чтобы узнать, следует ли использовать встроенную аутентификацию или нет. Есть и другие способы получить текущее имя пользователя (например, WindowsIdentity.GetCurrent()).

РЕДАКТИРОВАТЬ: Чтобы указать олицетворение для операции WCF, добавьте этот атрибут в метод, реализующий контракт:

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public void SomeMethod() 
{
    // do something here
}
person Henning Krause    schedule 18.10.2011
comment
Я предполагаю, что я должен был указать это для начала, но мне нужны учетные данные для передачи в точку доступа для выполнения операции службы. Я не просто хочу получить имя пользователя. - person devlife; 18.10.2011
comment
Что ж, тогда продолжайте и используйте DefaultCredentials с вашим запросом SharePoint. Это не должно быть проблемой. Проблема, с которой вы можете столкнуться, заключается в том, что вы не включили олицетворение в своей службе WCF. Смотрите мой ответ о том, как это сделать. А если ваша служба WCF и сервер Sharepoint находятся на разных серверах, вам потребуется настроить Kerberos, поскольку NTLM не поддерживает делегирование учетных данных. - person Henning Krause; 18.10.2011
comment
Я действительно не использую олицетворение. Учетные данные, которые я ожидаю получить от CredentialCache.DefaultCredential, — это идентификатор пула приложений (который я проверил правильно). - person devlife; 18.10.2011
comment
Тогда я не вижу здесь вашей проблемы — просто используйте DefaultCredential с вашим запросом Sharepoint. - person Henning Krause; 18.10.2011
comment
Проблема в том, что CredentialCache.DefaultCredential возвращает учетные данные с пустым доменом и именем пользователя вместо ожидаемого идентификатора пула приложений. - person devlife; 19.10.2011
comment
Возможно, вы могли бы опубликовать здесь код, чтобы мы могли увидеть, как вы делаете свой запрос. - person Henning Krause; 19.10.2011
comment
Если я позволю программе работать, я получаю неавторизованное исключение при вызове SharePoint. Это связано с тем странным фактом, что по какой-то причине имя пользователя и доменное имя пусты. - person devlife; 19.10.2011
comment
Получается, что кто-то поигрался с настройкой IIS и изменил идентификатор пула приложений. Именно поэтому мы не пускаем на сервер всех и их бабушек! Спасибо за вашу помощь, ребята. - person devlife; 19.10.2011

Я не уверен, как это работает на одном из ваших серверов? Надеюсь, вы уже прочитали этот http://msdn.microsoft.com/en-us/library/system.net.credentialcache.defaultcredentials.aspx, но в нем четко сказано: «Экземпляр ICredentials, возвращаемый DefaultCredentials, не может использоваться для просмотра имени пользователя, пароля или домена текущей безопасности. контекст».

person Tariqulazam    schedule 17.10.2011
comment
Это интересно. Я определенно вижу домен и имя пользователя в других средах. Я прочитаю это и посмотрю, не всплывет ли что-нибудь. - person devlife; 17.10.2011