System.DirectoryServices - Le serveur n'est pas opérationnel
J'obtiens une erreur par un site web, sur lequel j'ai utiliser l'Authentification Windows.
Choses étranges:
- Se produit uniquement si l'utilisateur n'est pas encore enregistré dans la base de données (nouveaux et inconnus de l'utilisateur)
- Apparaît uniquement sur le système live, tout beaux sur le développement local environnement
C'est ce que je reçois dans un enregistrement mail:
Source : Système D'.DirectoryServices
Message: Le serveur n'est pas opérationnel.
Trace:
au Système.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
au Système.DirectoryServices.DirectoryEntry.Bind()
au Système.DirectoryServices.DirectoryEntry.get_AdsObject()
au Système.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
au Système.DirectoryServices.DirectorySearcher.FindOne()
au Smarthouse.Les laboratoires.DataAccess.UserListManager.SaveUser(String windowsUserName)
C'est comment je mettre en œuvre DirectorySearch:
private void SaveUser(string windowsUserName)
{
string[] domainAndUser = windowsUserName.Split('\\');
string domain = domainAndUser[0];
string username = domainAndUser[1];
DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain);
DirectorySearcher search = new DirectorySearcher(entry);
try
{
//Bind to the native AdsObject to force authentication.
search.Filter = "(SAMAccountName=" + username + ")";
search.PropertiesToLoad.Add("cn");
search.PropertiesToLoad.Add("sn");
search.PropertiesToLoad.Add("givenName");
search.PropertiesToLoad.Add("mail");
SearchResult result = search.FindOne();
if (result == null)
{
throw new Exception("No results found in Windows authentication.");
}
User userToSave = new User();
userToSave.FirstName = (String) result.Properties["givenName"][0];
userToSave.LastName = (String) result.Properties["sn"][0];
userToSave.Email = (String) result.Properties["mail"][0];
userToSave.Username = windowsUserName;
userToSave.Guid = Guid.NewGuid();
SaveUser(userToSave);
}
catch (Exception ex)
{
throw new Exception("Error authenticating user. " + ex.Message, ex);
}
finally
{
//Dispose service and search to prevent leek in memory
entry.Dispose();
search.Dispose();
}
}
Si plus d'exemples de code sont nécessaires dites-le moi.
source d'informationauteur Tai Kahar
Vous devez vous connecter pour publier un commentaire.
Votre problème est que vous utilisez un "bon" nom de domaine bind - cela ne fonctionnera pas dans LDAP. En fait, si vous essayez de lier à
LDAP://MyDomain
ce que vous êtes vraiment faire est d'essayer de se lier à la serveur appeléMyDomain
.Vous avez besoin d'un LDAP valide chaîne de liaison - quelque chose comme
LDAP://dc=yourdomain,dc=local
ou quelque chose.Pour trouver ce que votre LDAP par défaut contexte de liaison, utilisez ce fragment de code:
Une fois que vous avez cette chaîne - utiliser comme votre chaîne de liaison de votre serveur LDAP.
Et si vous êtes sur .NET 3.5 et le haut, vous devriez vérifier le
System.DirectoryServices.AccountManagement
(S. DS.AM) de l'espace de noms. À lire ici:Fondamentalement, vous pouvez définir un contexte de domaine et de trouver facilement les utilisateurs et/ou groupes d'ANNONCES:
Le nouveau S. DS.SUIS, il est vraiment facile de jouer avec les utilisateurs et groupes AD!
À ajouter à marc_s la réponse ci-dessusj'avais besoin de faire des recherches dans plusieurs domaines.
Ainsi, pour chaque Domaine, je n'ai suivantes:
Vous pouvez utiliser bind chaînes de caractères dans le format LDAP://mondomaine.com:389. J'ai continué à obtenir "Accès Refusé" lorsque vous essayez d'utiliser le format LDAP://DC=mydomain,DC=com. Une fois que je suis passé à l'annuaire LDAP://mondomaine.com:389 format, et relié à l'aide de la AuthenticationTypes.ServerBind drapeau lors de la construction de mon DirectoryEntry, il a travaillé beaucoup. C'était dans Azure Service de l'App.
D'Erreur similaire m'est Arrivé (même si c'est arrivé tout le temps et pas dans des cas spécifiques, comme indiqué ici) à cause d'une mauvaise connexion Active Directory string. j'ai utilisé le corp au lieu de prod .
Utiliser quelque chose qui fonctionne pour une autre application dans votre organisation s'il existe.