Как использовать имена компьютеров в службах WCF с REST с аутентификацией Windows - PullRequest
1 голос
/ 06 августа 2010

Мы разрабатываем много служб WCF, которые размещены в IIS. (IIS 6.0 работает на Windows Server 2003 с пакетом обновления 2). Эти сервисы настроены для REST. Для среды (DEV, CERT, PROD) у нас обычно есть много служб на сервер IIS. Каждая служба имеет собственную учетную запись, которая назначается через пул приложений.

Это работает нормально, но если мы включим аутентификацию Windows в виртуальном каталоге (чтобы разрешить передачу пользовательского контекста, а не для олицетворения или делегирования), мы получим ошибки безопасности в определенных случаях. Если мы подключаемся к сервису в коде C # с помощью ServiceEndpoint, он работает, однако, когда мы подключаемся к сервисам через браузер или не код Wcf (например, HttpWebRequest, java и др.), Мы получаем ошибки безопасности.

Если я изменю аутентификацию в IIS с Negotiate, NTLM на NTLM, тогда это сработает. На самом деле происходит то, что мы отключаем Kerberos, и поскольку эти службы общаются с другими серверами в сети, мы начинаем сталкиваться с другими проблемами, когда службы не могут подключаться к удаленным серверам (обычно к SQL Server).

Теперь вот странная часть, если мы дадим машине псевдоним DNS (запись CNAME) и используем URL с псевдонимом, который работает. например,

http://dnsalias/service/myservice.svc/foo WORKS!
but
http://machinename/service/myservice.svc/foo  FAILS :(

Мы не можем дать всем этим машинам псевдонимы DNS (это было нашим решением на данный момент), потому что мы начинаем широко использовать виртуальные машины и раскручиваем их вверх и вниз. Таким образом, у нас есть только имена компьютеров, мы не хотим запускать сценарии псевдонимов DNS при раскрутке машины.

Теперь я знаю проблему с именем участника-службы, так как у нас на одном веб-сайте размещено несколько служб (обычно это веб-сайт по умолчанию), мы можем создать только 1 имя участника службы для сервера / учетной записи. Поскольку на каждом сервере мы размещаем несколько служб, каждый из которых сопоставлен с собственной учетной записью, это не решение проблемы.

setspn -a HTTP//WCFServer.domain.com customDomainAccount

Еще один недостаток: мы не определяем конечные точки в файлах конфигурации, только в коде, вот код для получения привязки REST.

protected internal static Binding GetWebHttpBinding()
        {
            // Create a new binding with Authentication enabled
            var binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly);

            // Set defaults
            SetTimeouts(binding);
            SetReaderQuotas(binding.ReaderQuotas);
            binding.MaxReceivedMessageSize = MaxReceivedMessageSize;
            binding.MaxBufferSize = 65536;

            // Set the Credential type to Windows to allow single sign-on
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

            // Need Streamed Response since Transport security does not allow streamed requests
            binding.TransferMode = TransferMode.StreamedResponse;

            return binding;
        }

Ответы [ 3 ]

0 голосов
/ 02 сентября 2011

Хорошо, намного позже я вернусь с ответом. Для описанной среды единственным ответом является использование аутентификации NTLM. Это было подтверждено звонком в службу поддержки Microsoft.

0 голосов
/ 12 февраля 2013

Я также получал аналогичные «ошибки безопасности» со встроенной аутентификацией Windows и WebHttpBinding, пытаясь использовать WebHttpSecurityMode.TransportCredentialOnly .., но мне требовался SSL, поэтому я смог придерживаться WebHttpSecurityMode.Transport при настройке HttpClientCredentialType.Windows .

0 голосов
/ 06 августа 2010

Я понял, что имя машины уже запись DNS.Необработанное имя / или имя машины на самом деле является ее IP-адресом.Итак, когда вы указываете «имя_машины» в своем URL-адресе, которое не работает, не является ли это уже записью DNS?Если вы пингуете 'machinename', какой IP-адрес показывает ответ на пинг;это должен быть IP машины.

Мне кажется, что вы создаете поиск DNS для поиска DNS.Не могли бы вы немного прояснить это?

Я могу подтвердить, что магия случается и со мной, как только я получаю DNS-запрос в домене для определения IP-адреса службы WCF или сайта, с которым я работаю, поэтому я понимаюоткуда вы пришли.

Я не знаю, как выглядит код вашего клиента, но посмотрите на следующую ссылку, чтобы найти соответствие.Вы должны создать сетевые учетные данные перед вызовом службы RESTful.Если вы сделаете это, решит ли это другую проблему с необходимостью разбить Kerberos?

...