7
votes

Utilisation de l'authentification Windows dans mon propre formulaire de connexion

J'ai une application WPF qui a une forme de connexion. Je souhaite que tous les utilisateurs Windows existants appartiennent à un groupe spécifique capable de se connecter à mon application.

Donc, ce dont j'ai besoin, c'est une manière dont l'utilisateur a donné son nom d'utilisateur et son mot de passe pour voir s'il s'agit d'un utilisateur, appartenant au groupe recherché et que le mot de passe est correct. Les commentaires que je peux utiliser pour décider si l'utilisateur est connecté ou non.


0 commentaires

3 Réponses :


2
votes

Valider un nom d'utilisateur et un mot de passe contre Active Répertoire?

Avec le résultat de la recherche doit pouvoir interroger les groupes pour cet utilisateur.


1 commentaires

Cela fonctionne si l'utilisateur est membre direct du groupe demandé, mais malheureusement, ne fonctionne pas pour l'adhésion à un groupe imbriqué, qui est très courant dans la publicité.



5
votes

Si vous avez besoin de savoir si l'utilisateur a une appartenance à un groupe d'annonces, vous devez utiliser le SID du groupe si l'utilisateur n'est pas un membre "direct" du groupe (c'est-à-dire que l'utilisateur est membre d'un membre imbriqué groupe qui lui-même est membre du groupe d'annonces "souhaité").

(J'ai utilisé cela depuis des années, mais il y a longtemps perdu le lien vers où je l'ai trouvé. Je suis em> il y a réellement Un moyen plus simple de vérifier les groupes imbriqués dans les services de dirifservices 4.0, mais je ne l'ai pas utilisé). p>

Si vous utilisez .NET 3.5 (comme indiqué dans le lien de Travis), vous pouvez vérifier l'utilisateur. Les informations d'identification comme ceci: p> xxx pré>

Si vous n'utilisez pas .NET 3.5, vous pouvez toujours vérifier les informations d'identification comme ceci: p>

static bool IsMember(DirectoryEntry group, DirectoryEntry user)
{
    group.RefreshCache(new string[] { "objectSid" });
    SecurityIdentifier groupSID =
        new SecurityIdentifier((byte[])group.Properties["objectSid"].Value, 0);

    IdentityReferenceCollection refCol;

    user.RefreshCache(new string[] { "tokenGroups" });

    IdentityReferenceCollection irc = new IdentityReferenceCollection();

    foreach (byte[] sidBytes in user.Properties["tokenGroups"])
    {
        irc.Add(new SecurityIdentifier(sidBytes, 0));
    }
    refCol = irc.Translate(typeof(NTAccount));
    PropertyValueCollection props = user.Properties["tokenGroups"];
    foreach (byte[] sidBytes in props)
    {
        SecurityIdentifier currentUserSID = new SecurityIdentifier(sidBytes, 0);
        if (currentUserSID.Equals(groupSID))
        {
            return true;
        }
    }
    return false;
}


2 commentaires

Cela a fonctionné comme un charme. Merci beaucoup pour donner une réponse détaillée!


Je le fais juste en avant, cela m'a également aidé il y a longtemps.



0
votes

La fonction ismember mentionnée ci-dessus a fonctionné pour moi lorsque vous vérifiez l'existence d'utilisateurs de domaine sur des groupes de domaine et des utilisateurs locaux et des groupes locaux, mais il n'a pas fonctionné lors de la vérification de l'existence de l'utilisateur de domaine sur un groupe local tel que IIS_IUSRS. Je l'ai modifié légèrement pour utiliser la propriété Membres du groupe et à la recherche d'une correspondance de chaque utilisateur ajouté avec le SID de l'utilisateur donné.

Voici le code P>

private static bool IsMember(DirectoryEntry group, DirectoryEntry user)
{
    SecurityIdentifier userSId = new SecurityIdentifier((byte[])user.Properties["objectSid"].Value, 0);
    foreach (object member in (IEnumerable)group.Invoke("Members"))
        {
        using (var memberEntry = new DirectoryEntry(member))
                {
                    var groupSId = new SecurityIdentifier((byte[])memberEntry.Properties["objectSid"].Value, 0);
                    if (userSId.Equals(groupSId))
                    {
                        return true;
                    }
                }
    }

    return true;
}


0 commentaires