2010-06-30 13 views
6

Estoy intentando escribir una aplicación C# que se conecta a TFS y recupera la información del elemento de trabajo. Desafortunadamente, parece que todos los ejemplos de uso del TFS SDK están usando las credenciales predeterminadas para el usuario actual (es decir, la información de inicio de sesión de mi dominio). La información más cercana que encontré es usar el constructor TeamFoundationServer (String, ICredentials), sin embargo, no puedo encontrar ninguna información para una clase adecuada que interactúe con la interfaz ICredentials (especialmente porque parece que no usa las ICredentials de System.Net sino un ICredentials específico de TeamFoundationServer) .¿Cómo se conecta a un servidor TFS en C# usando credenciales específicas?

¿Alguien tiene alguna idea para iniciar sesión en TFS con una combinación específica de nombre de usuario/contraseña/dominio?

Respuesta

16

El siguiente código debe ayudarle a:

NetworkCredential cred = new NetworkCredential("Username", "Password", "Domain"); 
tfs = new TeamFoundationServer("http://tfs:8080/tfs", cred); 
tfs.EnsureAuthenticated(); 

dominio es o bien el dominio real, o en una situación de grupo de trabajo, que sería el nombre del servidor que aloja el nivel de aplicación de TFS.

+0

¡Impresionante que funcionó! Gracias. – KallDrexx

+2

Tenga en cuenta que 'TeamFoundationServer' ha quedado en desuso en favor de' TfsConfigurationServer', pero este código también es válido. –

3

años en la línea, así es como lo haces con TFS 2013 API:

// Connect to TFS Work Item Store 
ICredentials networkCredential = new NetworkCredential(tfsUsername, tfsPassword, domain); 
Uri tfsUri = new Uri(@"http://my-server:8080/tfs/DefaultCollection"); 
TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(tfsUri, networkCredential); 
WorkItemStore witStore = new WorkItemStore(tfs); 

Si eso no funciona, trate de pasar las credenciales a través de otras clases Credential (trabajó para mí):

// Translate username and password to TFS Credentials 
ICredentials networkCredential = new NetworkCredential(tfsUsername, tfsPassword, domain); 
WindowsCredential windowsCredential = new WindowsCredential(networkCredential); 
TfsClientCredentials tfsCredential = new TfsClientCredentials(windowsCredential, false); 

// Connect to TFS Work Item Store 
Uri tfsUri = new Uri(@"http://my-server:8080/tfs/DefaultCollection"); 
TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(tfsUri, tfsCredential); 
WorkItemStore witStore = new WorkItemStore(tfs); 
+0

¿Por qué no pasa el 'NetworkCredential' directamente al' TfsTeamProjectCollection', en lugar de crear dos objetos innecesarios? –

+0

Bueno, lo intenté y recibí el infame error de 'La autenticación básica requiere una conexión segura con el servidor'. Incluso después de borrar mis entradas del Administrador de credenciales de Windows todavía estaba sucediendo. Luego experimenté un poco hasta que esto lo hizo funcionar. Tal vez tengas razón y no lo necesites :-) Solo quería salvar a alguien el problema – Heliac

+0

Gracias por los comentarios, eso es inesperado, así que me aseguraré de que lo analicemos. –

7

Para TFS 2015 & 2017, objetos y métodos anteriores han sido (o están siendo) en desuso. Para conectarse a TFS usando credenciales específicas:

// For TFS 2015 & 2017 

    // Ultimately you want a VssCredentials instance so... 
    NetworkCredential netCred = new NetworkCredential(@"DOMAIN\user.name", @"Password1"); 
    WindowsCredential winCred = new WindowsCredential(netCred); 
    VssCredentials vssCred = new VssClientCredentials(winCred); 

    // Bonus - if you want to remain in control when 
    // credentials are wrong, set 'CredentialPromptType.DoNotPrompt'. 
    // This will thrown exception 'TFS30063' (without hanging!). 
    // Then you can handle accordingly. 
    vssCred.PromptType = CredentialPromptType.DoNotPrompt; 

    // Now you can connect to TFS passing Uri and VssCredentials instances as parameters 
    Uri tfsUri = new Uri(@"http://tfs:8080/tfs"); 
    var tfsTeamProjectCollection = new TfsTeamProjectCollection(tfsUri, vssCred); 

    // Finally, to make sure you are authenticated... 
    tfsTeamProjectCollection.EnsureAuthenticated(); 

Espero que esto ayude.

Cuestiones relacionadas