Олицетворение IIS7 не работает для доступа к хранилищу TFS - PullRequest
7 голосов
/ 14 марта 2012

Я пытаюсь создать страницу ASP.NET, которая добавляет рабочий элемент в TFS.

Я включил олицетворение и проверку подлинности Windows:

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

На странице яполучить доступ к TFS и попытаться добавить рабочий элемент:

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

Однако он работает только при выборе SpecificUser в Олицетворение ASP.NET и сохранении учетных данных.Он не работает, когда выбран Аутентифицированный пользователь .

Я проверил, что SpecificUser такой же, как Аутентифицированный, но я получаю ошибки разрешения в последнем случае (которыйуказывает на то, что олицетворение работает неправильно).

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)

Следующие переменные выглядят одинаково в обоих случаях:

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

Есть идеи?

РЕДАКТИРОВАТЬ:

Действительно, как упоминал Джон ниже, проблема вызвана Делегация Kerberos .

Kerberos Delegation

I 'Мы нашли следующую статью и сопутствующий инструмент очень полезными для объяснения и смягчения этого:

DelegConfig - инструмент, помогающий решить проблемы аутентификации и делегирования Kerberos

Kerberos Delegation Check

Ответы [ 3 ]

7 голосов
/ 14 марта 2012

Я думаю, у вас может быть проблема "двойной прыжок" .

2 голосов
/ 14 марта 2012

Исходя из этой статьи, стоит добавить EnsureAuthenticated();

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

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

0 голосов
/ 14 марта 2012

Кто является пулом приложений для запущенного приложения IIS? По умолчанию я думаю, что это одна из учетных записей IIUSR, а не обязательно учетная запись домена с учетными данными для сервера TFS.

...