Расширенная ошибка PSI (System.Net.WebException: запрос не выполнен с состоянием HTTP 401: не авторизован.) - PullRequest
0 голосов
/ 06 октября 2010

В настоящее время я пытаюсь разработать веб-службу ExtendedPSI, которая в свою очередь вызывает ряд существующих веб-служб PSI. Проблема заключается в том, что я получаю сообщение об ошибке ( System.Net.WebException: запрос не выполнен с состоянием HTTP 401: не авторизован. ) при попытке доступа к существующим службам PSI с помощью созданного мной ExtendedPSI.

Я смогу заставить службу работать, если жестко закодировать учетные данные в моем ExtendedPSI, используя следующий фрагмент:

resWS.Credentials = new NetworkCredential("userName", "userPass", "domain");

но не при использовании:

resWS.Credentials = CredentialCache.DefaultCredentials;

(я пробовал CredentialCache.DefaultNetworkCredentials, но прочитал, что это не работает через HTTP или FTP)

Я прочитал множество постов с предложениями, такими как включение аутентификации Windows, удаление анонимного доступа и т. Д., Либо в клиентском web.config, либо в виртуальном из вызывающего веб-приложения, однако я использую SoapUI для вызова службы ExtendedPSI в качестве окончательного решения будет вызываться платформой ESB (а именно SAP PI).

Но с помощью SoapUI мне удалось по очереди вызвать все существующие службы PSI (веб-службы, называемые в моей службе ExtendedPSI), указав свои данные для входа в систему через интерфейс SoapUI, чтобы я знал, что существующие службы работают до тех пор, пока я могу их передать. на учетных данных, но они пусты, когда используя CredentialCache.DefaultCredentials .

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

Информация, которая мне нужна, хранится в HttpContext? Зашифрованный токен, который я могу передать (возможно, сюда) :)? Или мне понадобится общий пользователь для доступа к этим существующим веб-службам PSI?

К вашему сведению: я следовал статье http://msdn.microsoft.com/en-us/library/bb428837.aspx (которую я расширил далее, чтобы называть существующие PSI), но она предполагает своего рода клиента MS.NET, вызывающего службу.

Заранее спасибо ...

С уважением, TartanBono

1 Ответ

0 голосов
/ 27 апреля 2012

Вы должны изменить web.config вашего приложения следующим образом.Просто перезапишите узел безопасности в узле привязки:

<binding name="WssInteropSoap">
  <security mode="TransportCredentialOnly">
    <transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm"
        realm="" />
    <message clientCredentialType="UserName" algorithmSuite="Default" />
  </security>
</binding>

Теперь вы можете проходить аутентификацию без специальной учетной записи (сквозной из Windows) или с помощью этого кода вы можете указать учетную запись:

//credential impersonation (just if you changed your binding settings)
projectSvc.ClientCredentials.Windows.ClientCredential = new NetworkCredential("username", "password", "domain");
projectSvc.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

Надеюсь, это поможет:)

Я также написал запись в блоге для настройки подключения к PSI: Чтение пользовательских полей Project Server 2010 через PSI

...