2010-11-04 4 views
2

Je voudrais utiliser le modèle d'authentification Windows pour l'authentification des utilisateurs qui utilisent mon C# 3.5 application WinForms:System.Security.Principal.WindowsIdentity et WinForms authentification

  1. L'utilisateur qui a ouvert une session sur Windows est automatiquement connecté dans ma demande.
  2. Si l'utilisateur souhaite se connecter explicitement, son nom d'utilisateur et son mot de passe doivent être vérifiés par Windows ou, mieux encore, demandés par Windows avec une boîte de dialogue Windows standard. Le résultat devrait être un autre objet WindowsIdentity.

Le premier était très facile à résoudre depuis longtemps: j'ai lu le

WindowsIdentity identity = WindowsIdentity.GetCurrent(); 

Juste pour vous assurer, je vérifie la

if (identity.IsAuthenticated) { ... } 

Pour le deuxième cas, j'ai trouvé des appels d'API dans d'autres SO Q & A, mais je suis assez sûr il doit y avoir un moyen géré pour cela, ai-je tort?

En outre je me demande si mon approche pour 1. est sauver et approprié. Merci pour vos commentaires!

Mise à jour: Selon Ivan, je dois utiliser l'approche P/Invoke. C'est fondamentalement correct, mais j'ai encore besoin d'un moyen de récupérer un objet WindowsIdentity pour cet utilisateur, dont la propriété IsAuthenticated est définie sur true. L'appel P/Invoke en lui-même ne renvoie pas un tel objet. Comment cela peut-il être fait?

+0

Je ne sais pas pourquoi vous voulez faire la 2ème chose. Voulez-vous que l'utilisateur s'exécute en tant qu'utilisateur différent de celui auquel il est connecté? – giltanis

+0

@giltanis: Oui, je voulais que l'utilisateur puisse s'authentifier par nom d'utilisateur et mot de passe s'il veut utiliser un compte différent de celui actuellement connecté à Windows. – chiccodoro

Répondre

1

Je ne suis pas certain à ce sujet, mais il semble que vous voulez utiliser le WindowsIdentity Ctor qui prend un IntPtr. Pour obtenir le paramètre qui est passé dans ce constructeur, vous pouvez PInvoquer la fonction Win32 API LogonUser(). Cela vous donnera une WindowsIdentity pour cet utilisateur.

1

Il n'y a pas de moyen géré de faire cela, vous devez faire pinvoke (api appel) comme vous l'avez dit. Approche n ° 1 est totalement ok ... confiance microsoft :)