2009-02-23 8 views
1

Mon application prend l'utilisateur actuellement connecté et utilise un DirectoryServices.DirectorySearcher pour tirer quelques détails supplémentaires à leur sujet (certaines propriétés que nous avons stockées dans quelques champs AD personnalisés, ainsi que leur adresse e-mail). Cela fonctionne très bien, même si j'ai toujours pensé que c'était un peu lent - mon code monothread ne pouvait faire qu'environ 2-3 requêtes/seconde à AD.System.DirectoryServices place mon processeur en mode multithread - puis-je réduire le fardeau?

Le vrai problème est survenu lorsque j'ai déplacé ce code sur un serveur Web. Avec plusieurs utilisateurs simultanés, le nombre de requêtes/secondes saute grandement, et les chevilles de processus LSASS.EXE sur mon serveur. J'ai vérifié les contrôleurs de domaine, et ils sont très bien - le goulot d'étranglement est clairement du côté de l'application. Je suspecte que ce qui ralentit mon downdown est le défi/réponse de NTLM/Kerberos, et le nombre de demandes simultanées maintient même le processeur multi-core.

Notre stratégie de réseau n'autorise pas les lectures anonymes provenant de AD, de sorte que le choix est désactivé. En outre, j'ai essayé tous les membres de "AuthenticationTypes" (dans l'exemple, j'utilise .FastBind), mais ils semblent tous avoir à peu près le même débit avec la même charge sur le processeur.

Est-ce que quelqu'un a une idée de comment je pourrais contourner cette restriction et réduire mes demandes sur le processeur?

Voici le code que je utilise - assez simple:

Dim sPath As String = "LDAP://" & stringUserDN 
Dim entry As New DirectoryEntry(sPath) 
entry.AuthenticationType = AuthenticationTypes.FastBind 

For Each stringADNumber As String In entry.Properties(_ADPROP_EMPLOYEENUMBER) 
    'return first item 
    Return Convert.ToInt32(stringADNumber) 
Next 

Return String.Empty 

Répondre

1

Je n'ai pas une tonne d'expérience avec la recherche des objets dans la MA. Cependant, une suggestion est que vous pourriez vouloir vérifier dans le HttpContext pour la demande. Il existe des informations de base pour l'utilisateur actuel qui effectue la demande, telles que les groupes, le SID et les informations de jeton. Je ne crois pas qu'il existe un champ d'adresse e-mail par défaut, mais vous pouvez utiliser la propriété User.Name+ "@your.domain" pour créer une adresse e-mail.

Pour que ces données s'affichent, vous devez demander à IIS d'être authentifié pour les demandes. Les utilisateurs anonymes n'auront pas ces données peuplées. L'accesseur pour ces données est HttpContext.Current.Request.LogonUserIdentity ou, alternativement, dans le code derrière pour votre page, vous pouvez appeler this.Request.LogonUserIdentity pour faire court.

Espérons que cela aide. Bonne chance.