2011-12-02 4 views
5

Sto tentando di creare un bug in TFS2010 dalla rappresentazione di un utente, ma sempre ottenereTFS 2010 - Perché ricevo l'errore "TF30063 Non sei autorizzato ad accedere .." durante la rappresentazione?

"TF30063 You are not authorized to access.."

ho l'autenticazione utilizzando un account di servizio e quindi tentare di impersonare un account utente separato. Posso creare correttamente articoli di lavoro utilizzando entrambi gli account sia a livello di codice che nell'interfaccia utente web. Tuttavia, quando provo a creare l'elemento di lavoro utilizzato un account rappresentato (in entrambi i casi) ottengo sempre questo errore. Il mio codice è:

public int Save(List<KeyValuePair<string, string>> values, ticketType type,string user) 
    { 
     // get the Uri to the project collection to use 
     Uri tfsuri = new Uri("http://94.23.12.119:8085/tfs");    

     // get a reference to the team project collection (authenticate as generic service account) 
     using (var tfs = new TfsTeamProjectCollection(tfsuri, new System.Net.NetworkCredential("username", "password", "servername"))) 
     { 
      tfs.EnsureAuthenticated(); 

      //Now get the details of the user we want to impersonate 
      TeamFoundationIdentity identity = GetImpersonatedIdentity(tfsuri,tfs,user); 

      //Now connect as the impersonated user 
      using (TfsTeamProjectCollection ImpersonatedTFS = new TfsTeamProjectCollection(tfsuri, identity.Descriptor)) 
      { 
       ImpersonatedTFS.EnsureAuthenticated(); 
       var workItemStore = GetWorkItemStore(ImpersonatedTFS); 

       // create a new work item 
       WorkItem wi = new WorkItem(GetWorkItemType(type, workItemStore)); 
       { 
        //Values are supplied as a KVP - Field Name/Value 
        foreach (KeyValuePair<string,string> kvp in values) 
        { 
         if (wi.Fields.Contains(kvp.Key)) 
         { 
          wi.Fields[kvp.Key].Value = kvp.Value; 
         } 
        } 

        ValidationResult = wi.Validate();      
       } 

       if (ValidationResult.Count == 0) 
       { 

        wi.Save(); 
        return wi.Id; 
       } 
       else 
       { 
        return 0; 
       } 
      } 
     } 

    } 

Si ottiene con successo l'identità rappresentata ma cade sopra su

ImpersonatedTFS.EnsureAuthenticated(); 

Entrambi i conti hanno il 'Make richieste per conto di altri' set di autorizzazioni.

+0

Quanti luppoli stai facendo per arrivare a tfs? Nel caso di più nodi X-> Y-> Z, il servizio sulla casella Y potrebbe essere in grado di impersonare l'id del chiamante sulla casella X. Tuttavia, non si ha il diritto di passare tale rappresentazione su un servizio su un altro ancora casella Z. – user957902

+0

Solo un salto per quanto ne so. – Simon

risposta

0

Dove i tuoi utenti hanno il set di autorizzazioni Make requests on behalf of others? È a livello di raccolta dei progetti (a cui si accede tramite Team > Team Project Collection Settings > Security..) o al livello del server TFS (accessibile tramite Team Foundation Administration Console > Application Tier > Security..)?

Penso che il tuo problema è che hai solo il permesso di impersonare a livello di 'Server', ma stai cercando di impersonare in una collezione.

Questo è ciò che Taylor ha da dire nel suo post Introducing TFS Impersonation blog:

Questa autorizzazione è incapsulata all'interno di ogni collezione Project Team e all'interno del server di configurazione. Ciò significa che se l'utente A ha l'autorizzazione su TPC1, non sarà autorizzato a impersonare gli utenti quando si parla con TPC2 o con il server di configurazione. Allo stesso modo, se l'utente B dispone di questa autorizzazione sul server di configurazione , non sarà in grado di impersonare gli utenti quando si parla di una delle Raccolte progetto team.

1

Prima vorrei chiarire una cosa prima. Sembra che la tua applicazione sia un'applicazione server, nel qual caso non c'è alcun valore nell'uso di EnsureAuthenticated(). È solo un trucco di ottimizzazione delle prestazioni per aiutare i client UI/desktop.

Torna al tuo numero principale: - Se l'applicazione funziona come previsto quando si accede in locale ma non riesce quando si accede in remoto, si prega di leggere, altrimenti questa non è la soluzione per voi.

Il motivo della mancata riuscita è perché l'SPN deve essere aggiunto all'account del servizio nella directory attiva. È necessario che l'autenticazione Kerberos abbia luogo.

Questo è qualcosa che il team TFS deve spiegare perché molti sviluppatori si dimenticheranno di ciò mentre si concentrano sul lavoro che sta svolgendo. Spero che questo ti aiuti.

Per ulteriori informazioni sulla SPN e di fondamenti Kerberos, check out queste risorse:

Spero che questo aiuta.

Grazie!