Периодические «401: Несанкционированные» исключения с сервера - PullRequest
1 голос
/ 13 сентября 2011

У меня есть веб-сервис, размещенный в кластерной среде.Веб-приложение, которое вызывает эту службу, также размещено в кластерной среде, но на другом наборе серверов IIS6.Следовательно, серверами приложений являются appserv1 и appserv2, а серверами служб являются svcserv1 и svcserv2.Мы не контролируем, к каким серверам осуществляется доступ, поскольку мы обычно называем их либо appserv, либо svcserv соответственно.
Служба является службой WCF, но была создана для совместимости с инфраструктурой веб-службы .Net 2.0.Приложение работает нормально, когда оно запускается, но, вероятно,> 35% времени, когда служба отвечает Исключение: запрос не выполнен с состоянием HTTP 401: неавторизовано. ошибка.

I 'я видел других, которые рекомендуют устанавливать учетные данные напрямую, и мое приложение делает это следующим образом.

Dim cc As New CredentialCache()
Dim service As WCFServiceRef.Reports

service = New WCFServiceRef.Reports

service.Url = serviceURL
cc.Add(New Uri(service.Url), "Negotiate", New NetworkCredential("username", "password"))
service.Credentials = cc

reportData = service.GenerateReport(reportid, True, parameters, "PDF", Environment)

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

Я также видел эту статью MSDN KB, но так как у меня нет прямого доступа к конфигурации сервера (и трудно что-то изменить) Я хотел быть уверен, что со стороны приложения я ничего не могу сделать.Обратите внимание, что сервер настроен для аутентификации Windows и не разрешает анонимный доступ.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 13 сентября 2011

Многое зависит от того, используют ли ваши попытки аутентификации Kerberos или откат к NTLM.Я бы предложил использовать такой инструмент, как Fiddler, для захвата пакетов, отправляемых с вашего сервера приложений, для проверки того, какой протокол аутентификации используется.

Если вы обнаружите, что используете Kerberos, вот несколько вещей, которые можно попробовать:

  1. Попросите администраторов включить ведение журнала ошибок Kerberos на обоих серверах, затем повторите попытку проверки подлинности и проверьте наличие ошибок Kerberos в журналах событий.См. http://support.microsoft.com/kb/262177.
  2. Проверьте имена участников-служб, зарегистрированные для вашей службы - при условии, что полное доменное имя вашей службы - myservice.prd.ad, вам нужно два имени участника-службы - они должны быть зарегистрированы на серверах, на которых размещается ваша служба, если ваше приложение IIS6пул не работает как учетная запись службы, и в противном случае его следует зарегистрировать в учетной записи службы:
    • HTTP / MYSERVICE.PRD.AD
    • HTTP / MYSERVICE
  3. Также убедитесь, что любые записи DNS, зарегистрированные для вашей службы, являются записями A (имя хоста), а не записями CNAME (псевдоним).Я столкнулся с некоторыми проблемами в средах, в которых я работал, где машины XP / 2003 пытались получить билет Kerberos для неправильного имени участника-службы, когда записи CNAME использовались для DNS (тогда как машины Windows 7/2008 этого не делали).
  4. Вы также можете попробовать установить DelegConfig на своих сервисных серверах, это очень хорошо для решения самых распространенных проблем, возникающих у людей с аутентификацией Kerberos.См. http://www.iis.net/community/default.aspx?tabid=34&g=6&i=1887

Надеюсь, это немного поможет.Если вы используете NTLM, у меня, к сожалению, не так много идей, так как я привык работать в средах только с Kerberos.

1 голос
/ 13 сентября 2011

Прежде всего, проверьте журналы IIS на каждой машине и посмотрите, происходят ли ошибки 401 с одной машины.

Следующее, что нужно проверить - это 401, связанные с определенными URL.

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

Еще одна вещь для рассмотрения:

Вам нужны липкие сессии? Есть ли серверы, которые перерабатывают слишком часто?

Существует множество причин, по которым вы можете получать 401-е, поэтому вам просто нужно покопаться и выяснить, что происходит.

...