2016-04-21 7 views
0

So versuche ich eine Webanwendung (C#, asp.net 4.5) zu entwickeln, die Windows-Identität und Identitätswechsel verwendet, um eine Verbindung zu TFS (Team Foundation Server) und ruft einige Elemente (Arbeitsaufgaben, Aufgaben, usw.). Das Problem besteht darin, dass der Identitätswechsel nur auf dem Server funktioniert, auf dem die App ausgeführt wird, wie nur für meine Identität. Jedes Mal, wenn jemand versucht, eine Verbindung herzustellen, wird ihr Zugriff verweigert. Die App stürzt ab, wenn ein nicht autorisierter Fehler auftritt. "TF30063: Sie sind nicht berechtigt, auf [Serveradresse] zuzugreifen". Sicherlich sind die anderen Personen autorisiert, weil sie direkt auf TFS zugreifen können (nicht über meine App) und einige von ihnen sind Administratoren.Imitieren in C#, asp.net, Windows Identität

Die Strecke von Code, der den Fehler zurückgibt, ist dies ein

protected TfsTeamProjectCollection TeamProjectCollection 
     { 
      get 
      { 
       if (tpc == null) 
       { 
        // I HAVE ALSO TRIED THIS COMMENTED OUT PART, TOO. Still doesn't work. 
        // using (WindowsIdentity.GetCurrent().Impersonate()) 
        // { 
        // tpc = new TfsTeamProjectCollection(new Uri(ConnectionString)); 
        // } 
         var identityDescriptor = Microsoft.TeamFoundation.Framework.Client.IdentityHelper.CreateDescriptorFromSid(WindowsIdentity.GetCurrent().User); 
         tpc = new TfsTeamProjectCollection(new Uri(ConnectionString), identityDescriptor); 
       } 
       return tpc; 
      } 
     } 

Hat jemand anderes dies zuvor begegnet? Ich habe Tage damit verbracht, im Internet zu recherchieren, habe aber keine Antwort gefunden, die funktioniert. Hoffe ihr könnt mir helfen! Andere Erwähnungen: in web.config habe ich "Identität impersonate = true" gesetzt, in iis habe ich ASP.NET-Identitätswechsel und Windows-Authentifizierung aktiviert. Alle anderen Authentifizierungsoptionen sind deaktiviert.

+0

Ich denke, Sie müssen 'HttpContext.Current.User.Identity' anstelle von' WindowsIdentity.GetCurrent() 'verwenden. –

+0

Nein, tut mir leid. Ich wünschte, es wäre so einfach. Sie können httpcontext.cu nicht an den Deskriptor übergeben. Es braucht einen Parameter, der eine sid sein muss, also ist das kein gültiger Typ. Habe das gerade versucht. Danke trotzdem. –

+0

Ich habe keine richtige Antwort gegeben, weil ich mir über die Details nicht sicher bin. Ich bin jedoch ziemlich sicher, dass "WindowsIdentity.GetCurrent()" die Identität ist, die vom IIS-Arbeitsprozess verwendet wird, der ein Dienstkonto ist und nicht das, was Sie beim Zugriff auf TFS verwenden möchten. 'HttpContext.Current.User.Identity' liefert Ihnen die Identität des aktuellen Benutzers (der Benutzer im Browser) und Sie müssen dies in das gewünschte Formular für die Verwendung durch TFS in irgendeiner Weise übersetzen. Wenn Sie eine SID benötigen und nur einen Benutzernamen wie "DOMAIN \ USER" haben, müssen Sie diesen Benutzernamen einer SID in Ihrem Code zuordnen. –

Antwort

0

Ich verwende dieses Stück Code in einem WCF-Dienst Identitätswechsel:

/// <summary> 
/// Impersonation - Creates new instance of TfsTeamProjectCollection object using a different user; 
/// </summary> 
/// <param name="serverUri">Tfs server uri you want to connect using Impersonation</param> 
/// <param name="userToImpersonate">Account name of the user you want to Impersonate</param> 
private void Impersonation(Uri serverUri, string userToImpersonate) 
{ 
    try 
    { 
     eventLog1.WriteEntry("Start Impersonation"); 
     // Read out the identity of the user we want to impersonate 
     TeamFoundationIdentity identity = ims.ReadIdentity(IdentitySearchFactor.AccountName, 
      userToImpersonate, 
      MembershipQuery.None, 
      ReadIdentityOptions.None); 
     eventLog1.WriteEntry(identity.DisplayName); 
     this.impersonatedTFSUser = new TfsTeamProjectCollection(serverUri, identity.Descriptor); 
     eventLog1.WriteEntry(impersonatedTFSUser.Name); 
     eventLog1.WriteEntry("End Impersonation"); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 
0

Gelöst dies mit etwas Hilfe. Die Tatsache ist also, dass der App-Pool mit einem Benutzer ausgeführt werden muss, der Zugriff auf TFS hat und nicht viel mehr als das, wenn ich den TFS-Identitätswechsel verwende. Ich habe den ASP.net-Identitätswechsel deaktiviert und nur Windows Auth aktiviert. Außerdem habe ich die "Identität" aus den erweiterten Einstellungen des App-Pools zu meinem TFS-Benutzer geändert. Jetzt gibt es ein anderes Problem. Jeder, der die Web-App nutzt, kann nur die Projekte sehen, für die er und mein Benutzer Rechte haben. Beim Speichern eines Arbeitselements vereinheitlicht TFS automatisch das Feld "Erstellt von" mit der App-Pool-Identität (in diesem Fall mein Benutzer) und der "Zuletzt geändert" mit dem Benutzer, der die App ausführt. Das ist nicht, wie ich will, dass es funktioniert, also werde ich mehr Forschung machen.

Verwandte Themen