octobre
2004
Voici un truc, que j’ai trouvé et étudié ce week-end et qui ravira tout ceux qui, comme moi, sont mauvais en design :))
En effet, le bout de code que je vais vous donner vous permettra d’utiliser la fenêtre de connexion des passeports .NET dans vos propres application.
Comme c’est un peu confus, voici de quelle fenêtre je veux parler :
Vous l’aurez compris, cela fait evidemment beaucoup plus pro que vos propres fenêtres de connexion
Donc, voici le code que vous devez utiliser dans votre application:
[DllImport("credui.DLL")]
public static extern CredUIReturnCodes CredUIPromptForCredentials
(
ref CREDUI_INFO creditUR,
string targetName,
IntPtr reserved1,
int iError,
StringBuilder userName,
int maxUserName,
StringBuilder password,
int maxPassword,
ref int iSave,
CREDUI_FLAGS flags
);
[DllImport("credui.DLL")]
public static extern CredUIReturnCodes CredUIConfirmCredentials
(
string targetName,
bool confirm
);
#endregion
#region Enum + Structure
[Flags]
public enum CREDUI_FLAGS
{
INCORRECT_PASSWORD = 0x00001,
DO_NOT_PERSIST = 0x00002,
REQUEST_ADMINISTRATOR = 0x00004,
EXCLUDE_CERTIFICATES = 0x00008,
REQUIRE_CERTIFICATE = 0x00010,
SHOW_SAVE_CHECK_BOX = 0x00040,
ALWAYS_SHOW_UI = 0x00080,
REQUIRE_SMARTCARD = 0x00100,
PASSWORD_ONLY_OK = 0x00200,
VALIDATE_USERNAME = 0x00400,
COMPLETE_USERNAME = 0x00800,
PERSIST = 0x01000,
SERVER_CREDENTIAL = 0x04000,
EXPECT_CONFIRMATION = 0x20000,
GENERIC_CREDENTIALS = 0x40000,
USERNAME_TARGET_CREDENTIALS = 0x80000,
KEEP_USERNAME = 0x10000,
}
public enum CredUIReturnCodes
{
NO_ERROR = 0,
ERROR_CANCELLED = 1223,
ERROR_NO_SUCH_LOGON_SESSION = 1312,
ERROR_NOT_FOUND = 1168,
ERROR_INVALID_ACCOUNT_NAME = 1315,
ERROR_INSUFFICIENT_BUFFER = 122,
ERROR_INVALID_PARAMETER = 87,
ERROR_INVALID_FLAGS = 1004
}
[StructLayout(LayoutKind.Sequential)]
public struct CREDUI_INFO
{
public int cbSize;
public IntPtr hwndParent;
public string pszMessageText;
public string pszCaptionText;
public IntPtr hbmBanner;
}
#endregion
#region Méthodes
private const int MAX_USER_NAME = 100;
private const int MAX_PASSWORD = 100;
private const int MAX_DOMAIN = 100;
public static CredUIReturnCodes PromptForCredentials(CREDUI_INFO creditUI, string targetName, int netError, string userName, string password, bool save, CREDUI_FLAGS flags)
{
int saveCredentials;
StringBuilder user = new StringBuilder(MAX_USER_NAME);
StringBuilder pwd = new StringBuilder(MAX_PASSWORD);
saveCredentials = Convert.ToInt32(save);
creditUI.cbSize = Marshal.SizeOf(creditUI);
CredUIReturnCodes result = CredUIPromptForCredentials(ref creditUI, targetName, IntPtr.Zero, netError, user, MAX_USER_NAME, pwd, MAX_PASSWORD, ref saveCredentials, flags);
save = Convert.ToBoolean(saveCredentials);
userName = user.ToString();
password = pwd.ToString();
return result;
}
public static CredUIReturnCodes ConfirmCredentials(string target, bool confirm)
{
return CredUIConfirmCredentials(target, confirm);
}
#endregion
Maintenant, c’est bien beau tout ca, mis vous vous demandez peut-être comment ca marche ?
Et bien rien de plus simple, en voici d’ailleur un exemple:
string host = "Serveur SQL";
CREDUI_INFO info = new CREDUI_INFO();
info.hwndParent = this.Handle;
// Message Titre de la fenêtre
info.pszCaptionText = "Connexion à " + host;
// Message explicatif
info.pszMessageText = "Merci de bien vouloir entrer les informations de connexion à " + host;
// Les différents flags possible
CREDUI_FLAGS flags = CREDUI_FLAGS.GENERIC_CREDENTIALS | CREDUI_FLAGS.SHOW_SAVE_CHECK_BOX | CREDUI_FLAGS.ALWAYS_SHOW_UI | CREDUI_FLAGS.EXPECT_CONFIRMATION;
// Le nom d'utilisateur et le mot de passe
string userid = string.Empty;
string password = string.Empty;
//Case correspondant à la phrase : "Se souvenir du mot de passes"
// True = cochée
// False = Décochée
bool savePwd = true;
// On affiche la fenêtre
CredUIReturnCodes result = PromptForCredentials(info, host, 0, userid, password, savePwd, flags);
// Si pas d'erreur
if ( result == CredUIReturnCodes.NO_ERROR )
{
// A vous de tester ici si le mot de passe rentré est bien celui de l'utilisateur rentré
// Penser également à tester si le nom d'utilisateur est bien présent dans la base.
// Un conseil: pour éviter les SQL Injections, utilisez les requêtes paramétrées
MessageBox.Show("Authentifié");
// On est authentifié
ConfirmCredentials(host, true);
}
else
{
// Erreur
MessageBox.Show("Erreur d'authentification");
// On est pas authentifié
ConfirmCredentials(host, false);
}
Voila, comme vous pouvez lz voir, tout cela est très simple.
Il semblerait même que l’on puisse changer l’image affichée dans la boite de dialogue par sa propre image.
J’avoue ne pas avoir testé mais vous pouvez essayez vous même et me dire vos résultats.
Vous trouverez tout ce dont vous avez besoin ici
A noter: Cela n’est valable que sur Windows XP et Windows 2003
Amusez-vous bien
2 Commentaires + Ajouter un commentaire
Articles récents
- [Mix 07] Annonces diverses dont la possibilité de développer des applications SilverLight avec du code managé !
- [WPF] Article d’introduction à Windows Presentation Foundation Everywhere
- [WPF] Les CTP de WPF /E et Expression Studio sont en ligne !
- [Event] Première rencontre du Dotnet User Group (DUG)
- [.NET 3] Présentation du Framework .NET 3.0
Commentaires récents
- [Tips] Ouvrir un fichier vhd sans lancer une VPC dans
- [WPF] Article d’introduction à Windows Presentation Foundation Everywhere dans
- [WPF] Article d’introduction à Windows Presentation Foundation Everywhere dans
- Visual Basic Express 2005 et Visual Web Developer Express 2005 disponibles EN FRANCAIS ! dans
- [.NET 3] Présentation du Framework .NET 3.0 dans
Archives
- avril 2007
- décembre 2006
- novembre 2006
- octobre 2006
- septembre 2006
- août 2006
- juillet 2006
- juin 2006
- mai 2006
- avril 2006
- mars 2006
- février 2006
- janvier 2006
- décembre 2005
- novembre 2005
- octobre 2005
- septembre 2005
- août 2005
- juillet 2005
- juin 2005
- mai 2005
- avril 2005
- mars 2005
- février 2005
- janvier 2005
- décembre 2004
- novembre 2004
- octobre 2004
Oui, mais je n’ai pas encore regardé toutes les options possibles :))
Afin d’éviter ce genre de message un peu trop long, tu peux utiliser la balise suite (!M) qui scinde ton message en 2. C’est beaucoup plus lisible avec cette balise …
A+