2009-02-22 3 views
1

Existe-t-il un moyen d'utiliser un identifiant provenant de la liste de mots de passe enregistrée de l'utilisateur et de l'utiliser à la place des informations d'identification Windows locales?Comment faire une recherche dans Active Directory lorsque vous êtes appelé à distance?

Je dois rechercher l'adresse e-mail d'un utilisateur en fonction de son nom d'utilisateur Active Directory pour lui permettre de s'inscrire aux mises à jour par e-mail via un site intranet. Cela semble assez facile si l'utilisateur est effectivement connecté à une machine directement qui fait partie du domaine - je peux utiliser leur nom d'identité pour rechercher l'AD en fonction de leur nom d'utilisateur:

using(DirectoryEntry root = new DirectoryEntry("LDAP://admachine.domain.local")) 
{ 
    using(DirectorySearcher searcher = new DirectorySearcher(root)) 
    { 
    // strip the domain from the username and find the user in AD 
    var username = Regex.Replace(Page.User.Identity.Name, @".*\\", string.Empty); 
    searcher.ReferralChasing = ReferralChasingOption.All; 
    searcher.SearchScope = SearchScope.Subtree; 
    searcher.Filter = string.Format("(&(objectCategory=user)(objectClass=person)(sAMAccountName={0}))", username); 
    var foundUser = searcher.FindOne(); 

    // error checking occurs here... 
    var email = foundUser.Properties["mail"][0].ToString(); 

    // TODO: stuff with the email address 
    } 
} 

Cependant, si vous travaillez à partir d'un PC à la maison cela ne fonctionne pas. Page.Identity.Name résout le nom que je suis connecté sur mon propre PC (MyMachine\Dave), en ignorant les informations d'identification stockées que j'avais l'habitude de m'authentifier avec mon domaine de travail (WorkDomain\dave.downs). Le DirectoryEntry ramasse et utilise très bien les informations d'identification enregistrées, ce qui me permet de réellement lier et rechercher l'AD, mais je ne trouve pas un moyen de l'utiliser comme var username, qui contiendra ma machine locale nom d'utilisateur à la place.

Existe-t-il un moyen de faire ce que j'essaie réellement de faire, ou est-ce que je me contente de me tromper/de me heurter la tête contre un mur de briques?

+0

Comment l'authentification du serveur Web est-elle configurée et comment vous connectez-vous exactement? Je suis un peu confus que "Page.User.Identity.Name" peut être le nom d'utilisateur Windows d'une machine complètement non approuvée de l'extérieur du domaine - au moins lorsque l'authentification Windows a été utilisée. – Tomalak

+0

L'authentification est actuellement définie sur Windows et je compose à l'aide d'un client VPN Cisco. En plus de composer avec le client, je dois aussi fournir mon nom d'utilisateur et mon mot de passe si je veux faire quoi que ce soit sur le domaine, comme les navigateurs, afin que cela soit configuré dans ma liste de mots de passe gérés. –

+0

Etes-vous sûr que l'authentification Windows est également * utilisée * lorsque vous êtes connecté à distance? Y a-t-il des chances que le navigateur utilise néanmoins une authentification de base? Je suspecte encore une erreur de configuration/mésaventure ici ... – Tomalak

Répondre

1

Je suppose que vous utilisez IIS. Désactiver l'accès anonyme et activer l'authentification Windows. De cette façon, toute personne qui n'est pas dans le domaine obtiendra une fenêtre qui lui permet de spécifier son utilisateur et son mot de passe. Pour les utilisateurs provenant d'un serveur compatible avec le domaine, rien ne change. Mais de cette façon, vous garantissez que l'identité sera toujours résolue pour un utilisateur de domaine valide. Cela devrait donc résoudre votre problème "Je vois un utilisateur non-domaine". Vérifiez Windows Authentication Provider pour plus de détails.

+0

Mais si IIS * était * réglé sur anonyme, comment expliquez-vous que son code s'exécute lorsqu'il est dans l'entreprise? Devrait produire la même erreur, alors. – Tomalak

0

S'ils sont connectés via Windows Auth, vous pouvez utiliser:

System.Security.Principal.WindowsIdentity.GetCurrent().User 

qui vous donnera la sid de l'utilisateur connecté.

Désactiver l'accès anonyme et la sécurité intégrée dans IIS, les obliger à se connecter via l'authentification de base sous https. Cela permettra de s'assurer que la session en cours s'exécute sous un utilisateur de domaine authentifié.

Questions connexes