Мне нужно вызвать службу WCF программно. Служба может быть размещена с аутентификацией NTLM или Kerberos и должна работать в любом из них. То есть, если подключение к сервису через Kerberos не удается, тогда оно должно вернуться к NTLM.
Вот код, который я использую для аутентификации Kerberos (при необходимости служба размещается в SharePoint 2010 и вызывается из веб-части):
public static SiteMembershipSvc.SiteMembershipServiceClient InitialiseSiteMembershipService(string url)
{
var binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
url = url.EndsWith("/") ? url + SiteMembershipAddress : url + "/" + SiteMembershipAddress;
var endpoint = new EndpointAddress(url);
var proxy = new SiteMembershipSvc.SiteMembershipServiceClient(binding, endpoint);
proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
return proxy;
}
Вызов метода на прокси при запуске в среде NTLM выдает ошибку:
HTTP-запрос не авторизован с
схема аутентификации клиента
«Переговоры». Заголовок аутентификации
получен от сервера 'NTLM'.
Примечание. URL-адрес может находиться в другом веб-приложении на другом сервере. Я не могу проверить, под какой аутентификацией работает веб-приложение веб-части, и предположить, что оно совпадает с местом размещения службы WCF.
Как я могу (автоматически или вручную) обеспечить, чтобы при сбое аутентификация возвращалась из Kerberos обратно в NTLM?
Обновление:
Как уже упоминалось, ошибка аутентификации возникает при вызове веб-метода. Однако я не хочу ждать так долго, поскольку в службе есть несколько веб-методов, вызываемых из нескольких мест. Я хотел бы проверить аутентификацию в точке, где настроен прокси (во фрагменте кода выше).
Я пытался использовать proxy.Open()
, но это не похоже на сбой.