2009-06-17 5 views
0

Je reçois une erreur d'application Web qui permet aux utilisateurs de l'intranet d'entreprise de mettre à jour les détails de leur répertoire actif (numéros de téléphone, etc.).Mise à jour d'Active Directory à partir de l'application Web Erreur

L'application Web est hébergée sur IIS6 exécutant Windows Server 2003 (SP1). Le site Web IIS utilise l'authentification NTLM et la sécurité intégrée est activée sur le site Web. Le pool d'applications IIS s'exécute en utilisant le compte "Service réseau".

Le web.config contient les éléments suivants

<LdapConfigurations server="xxx.internal" root="OU=Staff Accounts,DC=xxx,DC=internal" domain="xxx" /> 
<identify impersonate=”true” /> 

Code délégation Active Directory n'est pas nécessaire que les éléments suivants C# (.NET 3.5) devrait transmettre les détails de l'usurpation d'identité correcte (y compris jeton de sécurité) sur Active Directory .

public void UpdateData(string bus, string bus2, string fax, string home, string home2, string mob, string pager, string notes) 
{ 
    WindowsIdentity windId = (WindowsIdentity)HttpContext.Current.User.Identity; 
    WindowsImpersonationContext ctx = null; 

    try 
    { 
     ctx = windId.Impersonate(); 

     DirectorySearcher ds = new DirectorySearcher(); 
     DirectoryEntry de = new DirectoryEntry(); 

     ds.Filter = m_LdapUserFilter; 

     // i think this is the line causing the error 
     de.Path = ds.FindOne().Path; 

     this.AssignPropertyValue(bus, ADProperties.Business, ref de); 
     this.AssignPropertyValue(bus2, ADProperties.Business2, ref de); 
     this.AssignPropertyValue(fax, ADProperties.Fax, ref de); 
     this.AssignPropertyValue(home, ADProperties.Home, ref de); 
     this.AssignPropertyValue(home2, ADProperties.Home2, ref de); 
     this.AssignPropertyValue(mob, ADProperties.Mobile, ref de); 
     this.AssignPropertyValue(pager, ADProperties.Pager, ref de); 
     this.AssignPropertyValue(notes, ADProperties.Notes, ref de); 

     // this may also be causing the error? 
     de.CommitChanges(); 
    } 
    finally 
    { 
     if (ctx != null) 
     { 
      ctx.Undo(); 
     } 
    } 
} 

private void AssignPropertyValue(string number, string propertyName, ref DirectoryEntry de) 
{ 
    if (number.Length == 0 && de.Properties[propertyName].Value != null) 
    { 
     de.Properties[propertyName].Remove(de.Properties[propertyName].Value); 
    } 
    else if (number.Length != 0) 
    { 
     de.Properties[propertyName].Value = number; 
    } 
} 

détails de l'utilisateur peuvent être récupérées à partir d'Active Directory sans problème mais la question se pose lorsque la mise à jour des utilisateurs Détails de l'annonce. Le message d'exception suivant est affiché.

System.Runtime.InteropServices.COMException (0x80072020): An operations error occurred. 
     at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) 
     at System.DirectoryServices.DirectoryEntry.Bind() 
     at System.DirectoryServices.DirectoryEntry.get_AdsObject() 
     at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne) 
     at System.DirectoryServices.DirectorySearcher.FindOne()  
     at xxx.UpdateData(String bus, String bus2, String fax, String home, String home2, String mob, String pager, String notes) 
     at xxx._Default.btnUpdate_Click(Object sender, EventArgs e) 

Le code fonctionne très bien dans notre domaine de développement mais pas dans notre domaine de production. Quelqu'un peut-il aider à aider à résoudre ce problème?

Répondre

0

Le problème ne résidait pas dans le code mais dans la configuration du serveur sur le domaine. Pour une raison quelconque, l'administrateur réseau n'a pas sélectionné l'option «Trust Computer for Delegation» dans le répertoire actif.Heureusement, le problème n'était pas un problème de «double saut» :)

0

Il semble que vous ayez un problème de numéro SPN en double?

Voilà pourquoi je pense qu'il pourrait être un problème:

  1. Il fonctionne dans votre environnement de dev (en supposant qu'il utilise également un service de réseau, et sur le même domaine)
  2. Vous avez usurper l'identité sur, dans votre configuration web. Lorsqu'il y a un SPN en double, il invalide le jeton de sécurité, donc même si vous l'avez créé correctement dans le code, AD ne "fait pas confiance" à ce serveur pour usurper l'identité, de sorte que le serveur qui reçoit la demande change AD (de vos contrôleurs de domaine) reçoit la demande mais la supprime car l'autorisation de suppression n'a pas été appliquée sur le compte d'ordinateur dans AD ou SPN (duplication ou nom d'ordinateur/nom de domaine incorrect)

Ou à moins dans mon expérience c'est 9 fois sur 10 le problème.

0

Je suppose que le problème est que cela fonctionne sur l'environnement de développement parce que lorsque vous lancez votre webapp là-bas, vous l'exécutez avec votre compte personnel qui a probablement le droit d'écrire dans AD. Dans l'environnement de production, vous devez vous assurer que le processus exécutant votre webapp (compte de service réseau) a également les droits de mettre à jour l'AD. Il me semble que cela pourrait être le problème puisque j'ai eu un problème similaire une fois.

+0

J'ai vérifié dans les deux environnements, je suis seulement un membre du groupe "Domain Users". – Kane

Questions connexes