Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#][WPF] Login form avec les Identifiants Windows

PrincipalContext, LogonUser, ValidateCredentials

Sujet résolu
    26 février 2023 à 9:20:51

    Bonjour les codeurs,

    Je rencontre un pb depuis deux jours sur une petite appli que je suis entrain de coder sur la validation des username/password,

    Alors que resumé, j'ai un login WPF Window qui en s'ouvrant le bureau, la barre de tache et le task manager se cachent et ne sont plus accessible.

    L'utilisateur doit donc mettre ses identifiants pour les récupérer, mon problème est que le test des identifiants me retour toujours true peut import ce que je met, et je l'ai fais de deux manières différentes comme suite :

    En utilisant "PrincipalContext" ce code est dans la méthode click de mon bouton login

    string username = txtUsername.Text;
    string password = txtPassword.Password;
    
    using (PrincipalContext context = new PrincipalContext(ContextType.Machine))
    {
         bool isValid = context.ValidateCredentials(username, password);
         if (isValid)
         {
             lblMessage.Content = "Valid username and password";
         }
         else
         {
             lblMessage.Content = "Invalid username or password";
         }
    }


    Et en utilisant le "LogonUser"

    [DllImport("Advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
    

    ce code est dans la méthode click de mon bouton login

    string username = txtUsername.Text;
    string password = txtPassword.Password;
    
    
    bool isAuthenticated = false;
    IntPtr token;
    
    try
    {
         isAuthenticated = LogonUser(txtUsername.Text, null, txtPassword.Password, 3, 0, out token);
    }
    catch (Exception ex)
    {
    
    }
    if (isAuthenticated)
    {
         // Credentials are valid
         lblMessage.Content = "Youhoooo !";
    }
    else
    {
         // Credentials are invalid
         lblMessage.Content = "Invalid username or password";
    }

    Je galère avec ça depuis deux jours...

    On peut considère mon appli comme une alternative au window lock screen, sauf qu'avec la façon que je l'ai fais j'écris rien sur le regedit et tout, on va dire c'est la manière "Douce".... il se peut du coup que ça soit parce que mon windows est déjà LoggedIn quand je lance l'appli qu'il me renvoi tout le temps un "TRUE" à la validation des identifiants... c'est la seule piste que j'ai et si elle s'avere vrai je laissera probablement tombé l'idée...

    Si quelqu'un à des pistes ou une meilleure façon de faire, je serais toute ouïe..

    Merci à tous

    Mehdi

    -
    Edité par dadicoool 26 février 2023 à 9:21:48

    • Partager sur Facebook
    • Partager sur Twitter

    Patience ensures victory !    - Ali Ibn Abi Taleb

      27 février 2023 à 9:26:38

      C'est pas logique votre machin.

      Votre application doit avoir accès à un bureau, donc avec une session, donc avoir passé l'authentification.

      Pourquo ne pas faire une GinaDll ?

      https://learn.microsoft.com/fr-fr/windows/win32/secauthn/winlogon-and-gina

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        2 mars 2023 à 16:32:06

        Mon machin est très logique,

        Quand vous essayez d’accéder à vos mots de passe enregistrer sur Google à partir de votre Google Chrome, il vous demande d’entrer le mot de passe Windows, même si vous êtes déjà connecté avec votre compte administrateur.

        • Partager sur Facebook
        • Partager sur Twitter

        Patience ensures victory !    - Ali Ibn Abi Taleb

          2 mars 2023 à 17:47:14

          >à vos mots de passe enregistrer sur Google

          Dans Chrome, pas Google (Cloud)

          Oui, pour afficher des informations sensibles et personnelles à un compte, pas planquer une bare ou un gestionnaire des tâches.

          Et vous n'imaginez pas le nombre de circonvolutions (process externe, token migitation, etc...) que ce machin a demandé pour ne plus être un énorme trou de sécurité (enfin, pour en réduire la taille).

          Vous voulez prendre la main sur le login/password de l'OS, utilisez la méthode recommandée : GINA dll.

          Comme vous faites une authentification locale sur une machine qui accepte le compte "Guest", vous avez droit à un "True".

          https://stackoverflow.com/questions/7336193/validatecredentials-returns-true-for-unknown-user

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            5 mars 2023 à 20:19:04

            Merci pour le lien mon Ami,

            J'ai pu régler mon problème en utilisant la meme approche que le gars qui pose la question càd en vérifiant si le username exist, avant de valider les identiafiants.

            Ci-dessous les bouts de code pour ceux qui auraient le meme pb

            CrendtialsValidator.cs : qui prends comme arguments deux string username et password

            public class CredentialsValidator
                {
                    public static bool AreValid(string username, string password)
            { string machineName = Environment.MachineName; DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + machineName) using (var user = localMachine.Children.Find(username, "user")) { using (var context = new PrincipalContext(ContextType.Machine)) { return context.ValidateCredentials(username, password); } } } }


            Et la Methode de mon bouton qui utilise la class CrendtialsValidator.cs


            username = txtUsername.Text;
            password = txtPasswordBox.Password;
                        try
                        {
                            bool isAuthenticated = CredentialsValidator.AreValid(username, password);
            
                            if (isAuthenticated)
                            {
                                MessageBox.Show("Authentication succeeded.", "Success !", MessageBoxButton.OK, MessageBoxImage.Information);
                                CloseAllWindows();
                            }
                            else
                            {
                                MessageBox.Show("Authentication failed.", "Error !", MessageBoxButton.OK, MessageBoxImage.Error);
                            }
                        }
                        catch (Exception)
                        {
                            MessageBox.Show("Authentication failed", "Error !", MessageBoxButton.OK, MessageBoxImage.Error);
                        }


            On remarque que j'ai pas envie de gérer les exceptions différemment que les erreurs d'authentifications... je verrais ça aprés.

            Mehdi

            • Partager sur Facebook
            • Partager sur Twitter

            Patience ensures victory !    - Ali Ibn Abi Taleb

              5 mars 2023 à 22:39:20

              Merci pour ce retour.

              L'utilisation d'une string pour un mot de passe me grattouille d'un point de vue sécurité. (En clair en mémoire jusqu'à la fin du processus)

              Utiliser une SecureString est peut-être plus raisonnable, non ?

              https://learn.microsoft.com/fr-fr/dotnet/api/system.security.securestring?view=net-7.0

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

              [C#][WPF] Login form avec les Identifiants Windows

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown