2012-03-14 15 views
7

Estoy tratando de crear una página ASP.NET que agregue un elemento de trabajo en TFS.IIS7 Suplantación de identidad no funciona para acceder al repositorio de TFS

He permitido suplantación y la autenticación de Windows:

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

En la página, puedo acceder a TFS y trato de añadir un elemento de trabajo:

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

Sin embargo, sólo funciona cuando selecciono SpecificUser en ASP.NET Suplantación de identidad y almacenar las credenciales. No funciona cuando se selecciona Usuario autenticado.

He comprobado que el Usuario Específico es el mismo que el Autenticado, pero obtengo errores de permiso en este último caso (lo que indica que la suplantación no funciona correctamente).

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) 

las siguientes variables tienen el mismo para ambos casos:

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

¿Alguna idea?

EDIT:

De hecho, como Juan menciona a continuación, el problema es causado por la delegación de Kerberos .

Kerberos Delegation

que he encontrado el siguiente artículo y una herramienta que acompaña muy útil para explicar y mitigar esto:

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

Kerberos Delegation Check

Respuesta

7

Creo que puede tener un problema "double hop".

+0

+1 ... acaba de implementar un conjunto de herramientas de interfaz web basadas en la web, que interactúan con tfs, en "otra máquina" como una aplicación web en iis. Estoy observando el mismo comportamiento que el descrito en esta publicación. ¿Alguna solución provisional conocida? gracias por adelantado. – culturalanomoly

+0

Sí. Haga clic en el enlace "doble salto" en mi respuesta. –

0

¿Quién es el grupo de aplicación para la aplicación de IIS corriendo como? De manera predeterminada, creo que es una de las cuentas IIUSR y no necesariamente una cuenta de dominio con credenciales para el servidor TFS.

+0

Utiliza el ApplicationPoolIdentity predeterminado, pero es por eso que he configurado la suplantación, para que se pueda acceder a TFS con las credenciales del usuario. –

2

Basado en this artículo, vale la pena un tiro para añadir EnsureAuthenticated();

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

yo no he probado esto, así que sólo puede esperar que 'll trabajo.

Cuestiones relacionadas