2012-03-14 14 views
7

Próbuję utworzyć stronę ASP.NET, która dodaje element pracy w TFS.Personifikacja IIS7 nie działa, aby uzyskać dostęp do repozytorium TFS

mam włączony personifikacji i uwierzytelnianie Windows:

<authentication mode="Windows" /> 
<identity impersonate="true" password="" userName="" /> 
<customErrors mode="Off" /> 

Na stronie, mam dostępu TFS i spróbować dodać element prac:

TfsTeamProjectCollection prjCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("xxx")); 
WorkItemStore store = prjCollection.GetService<WorkItemStore>(); 
... 

Jednak to działa tylko po zaznaczeniu SpecificUser w Personifikacja ASP.NET i zapisz poświadczenia. Nie działa po wybraniu użytkownika uwierzytelnionego .

Sprawdziłem, czy użytkownik SpecificUser jest taki sam jak uwierzytelniony, ale w tym drugim przypadku dostaję błędy uprawnień (co wskazuje, że podszywanie się nie działa poprawnie).

TF30063: You are not authorized to access XXX. ---> System.Net.WebException: The remote server returned an error: (401) Unauthorized. 
    at System.Net.HttpWebRequest.GetResponse() 
    at  Microsoft.TeamFoundation.Client.TeamFoundationClientProxyBase.AsyncWebRequest.ExecRequest(Object obj) 
    --- End of inner exception stack trace --- 
    at  Microsoft.TeamFoundation.Client.TeamFoundationClientProxyBase.ProcessHttpResponse(HttpWebResponse response, Stream responseStream, WebException webException, XmlReader& xmlResponseReader) 
    at Microsoft.TeamFoundation.Client.TeamFoundationClientProxyBase.ExecWebServiceRequest(HttpWebRequest request, XmlWriter requestXml, String methodName, HttpWebResponse& response) 
    at Microsoft.TeamFoundation.Framework.Client.LocationWebService.Connect(Int32 connectOptions, ServiceTypeFilter[] serviceTypeFilters, Int32 lastChangeId) 
    at Microsoft.TeamFoundation.Framework.Client.FrameworkServerDataProvider.Connect(ConnectOptions connectOptions) 
    at Microsoft.TeamFoundation.Framework.Client.FrameworkServerDataProvider.EnsureConnected(ConnectOptions optionsNeeded) 
    at Microsoft.TeamFoundation.Framework.Client.FrameworkServerDataProvider.get_InstanceId() 
    at Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore.InitializeInternal() 
    at Microsoft.TeamFoundation.Client.TfsTeamProjectCollection.InitializeTeamFoundationObject(String fullName, Object instance) 
    at Microsoft.TeamFoundation.Client.TfsConnection.CreateServiceInstance(Assembly assembly, String fullName) 
    at Microsoft.TeamFoundation.Client.TfsConnection.GetService(Type serviceType) 
    at Microsoft.TeamFoundation.Client.TfsConnection.GetService[T]() 
    at ASP.index_aspx.__Render__control1(HtmlTextWriter __w, Control parameterContainer) 

następujących zmiennych wyglądają tak samo dla obu przypadkach:

HttpContext.Current.Request.LogonUserIdentity.Name 
HttpContext.Current.Request.IsAuthenticated 
HttpContext.Current.User.Identity.Name 
System.Environment.UserName 
System.Security.Principal.WindowsIdentity.GetCurrent().Name 

Jakieś pomysły?

EDIT:

Rzeczywiście, jak John wymienionych poniżej, problem jest spowodowany przez Kerberos Delegatury.

Kerberos Delegation

znalazłem poniższy artykuł i narzędzie towarzyszący bardzo użyteczne w wyjaśnianiu i ograniczania w ten sposób:

DelegConfig - A Tool To help resolve Kerberos authentication and delegation issues

Kerberos Delegation Check

Odpowiedz

7

Myślę, że możesz mieć problem z "double hop".

+0

+1 ... po prostu wdrożyłem zestaw internetowych narzędzi interfejsu użytkownika, które łączą się z tfs na "inną maszynę" jako aplikację internetową na iis. obserwuję zachowanie podobne do opisanego w tym poście. wszelkie znane rozwiązania? z góry dziękuję. – culturalanomoly

+0

Tak. Kliknij link "podwójny skok" w mojej odpowiedzi. –

0

Kto jest pula aplikacji dla aplikacji IIS działa jako? Domyślnie uważam, że jest to jedno z kont IIUSR i niekoniecznie konto domeny z danymi uwierzytelniającymi dla serwera TFS.

+0

Używa domyślnego ApplicationPoolIdentity, ale właśnie dlatego ustawiłem personifikację, aby umożliwić dostęp do TFS przy użyciu poświadczeń użytkownika. –

2

podstawie this artykułu, to warto spróbować, aby dodać EnsureAuthenticated();

TfsTeamProjectCollection prjCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("xxx")); 
prjCollection.EnsureAuthenticated(); 
WorkItemStore store = prjCollection.GetService<WorkItemStore>(); 

Nie kiedykolwiek próbowałem, więc mogę tylko nadzieję, że „praca ll.

Powiązane problemy