wtorek, 21 czerwca 2011

Problem z dostępem do UserProfileService z formularza InfoPath

Sytuacja wyglądała następująco:
  • Dla listy na SharePoincie 2010 zmodyfikowałem istniejący formularz w programie InfoPath
  • Utworzyłem DataConnection do UserProfileService, ponieważ potrzebowałem w formularzu informacje o zalogowanym użytkowniku.
  • Wszystko pięknie działało.

W czasie wdrożenia podjęto decyzję aby udostępnić SharePoint WebApplication pod nowym adresem, utworzyłem więc Alternate Access Mapping, administrator sieci przypisał ten nowy adres do IP serwera i aplikacja zaczęła hulać... za wyjątkiem formularza korzystającego z UserProfileService.

Komunikat błędu głosił że jest problem z WebService'm. UlsViewer precyzował, że chodzi o brak autoryzacji na serwerze. Kod błędu 401.

Przerobiłem więc DataConnection w formularzu InfoPath na ConnectionFile, umieszczone w bibliotece DataConnections w tym samym Site co lista:



Teraz już wiem że nie miało to żadnego znaczenia.

W Central Administration > Manage Service Application zająłem się User Profile Service Aplication. W Manage Users Permissions nadałem pełne prawa grupie do której należeli wszyscy użytkownicy aplikacji SharePoint.

Nie pomogło.

Na trop rozwiązania naprowadził mnie fakt, że będąc na serwerze SharePointa nie mogłem otworzyć aplikacji pod nowym adresem zdefiniowanym w Alternate Access Maping, mogłem wejść tylko na stary adres, składający się z nazwy komputera  i numeru portu.

Rozwiązanie jest opisane tutaj:  http://support.microsoft.com/kb/926642 i wydaje się mieć niewiele wspólnego z przedstawionym problemem Zwłaszcza że mój serwer to Windows 2008 R2. Sądzę że przyczyną problemu jest to, że Alternate Access Maping spowodował „double hop", z którym SharePoint z powodu błędu istniejącego w systemie operacyjnym nie umiał sobie poradzić. Zresztą pal licho przyczynę, gdy mamy rozwiązanie:



1.       Kliknij Start, Uruchom, wpisz regedit, i kliknij OK.
2.       Przejdź do następującego klucza w rejestrze:
       HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
3.       Kliknij prawym przyciskiem na Lsa, wybierz New, a następnie DWORD Value.
4.       Wpisz DisableLoopbackCheck i naciśnij Enter.
5.       Kliknij prawym przyciskiem na DisableLoopbackCheck i wybierz Modify.
6.       W polu Value wpisz 1 i kliknij OK.
7.       Jak dla mnie tyle wystarczyło, ale możesz jeszcze zrestartować komputer.