Ich erstelle eine Xaml/C# -Anwendung, und ich möchte es mit einer Login-Eingabeaufforderung Popup.Windows Sicherheit Benutzerdefinierte Login-Validierung
Ich würde gerne wissen, ob es möglich ist, CredUIPromptForWindowsCredentials zu verwenden.
- anzeigen Windows-Sicherheitsdialog
- der eingegebene Benutzername & Passwort Get
- Perform Validierung Benutzerdefinierte
- Wenn die Validierung succes -> weiter App
- sonst, wenn die Validierung fehlgeschlagen -> -Informiere Benutzer ungültiger Benutzername oder Passwort
Ich habe bereits Windows Security login form? undbetrachtet, aber sie erklären nicht, wie die Validierung zu handhaben ist.
Ich würde wirklich gerne ein kleines Beispiel, wo, wenn der Benutzer username = "Bo" und password = "123" dann sucsecse sonst Fehlermeldung eingeben und dem Benutzer erlauben, es erneut zu versuchen.
Die App wird auf mehreren Computern installiert.
Oder ist das einfach nicht möglich?
aktualisieren
durch die Antwort auf diese Frage Inspired Show Authentication dialog in C# for windows Vista/7
Ich habe den Code geändert wie erwartet zu funktionieren.
Bitte nicht, dass der Validierungsteil nur für den Proof of Concept gedacht ist.
WindowsSecurityDialog.cs
public class WindowsSecurityDialog
{
public string CaptionText { get; set; }
public string MessageText { get; set; }
[DllImport("ole32.dll")]
public static extern void CoTaskMemFree(IntPtr ptr);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private struct CREDUI_INFO
{
public int cbSize;
public IntPtr hwndParent;
public string pszMessageText;
public string pszCaptionText;
public IntPtr hbmBanner;
}
[DllImport("credui.dll", CharSet = CharSet.Auto)]
private static extern bool CredUnPackAuthenticationBuffer(int dwFlags,
IntPtr pAuthBuffer,
uint cbAuthBuffer,
StringBuilder pszUserName,
ref int pcchMaxUserName,
StringBuilder pszDomainName,
ref int pcchMaxDomainame,
StringBuilder pszPassword,
ref int pcchMaxPassword);
[DllImport("credui.dll", CharSet = CharSet.Auto)]
private static extern int CredUIPromptForWindowsCredentials(ref CREDUI_INFO notUsedHere,
int authError,
ref uint authPackage,
IntPtr InAuthBuffer,
uint InAuthBufferSize,
out IntPtr refOutAuthBuffer,
out uint refOutAuthBufferSize,
ref bool fSave,
int flags);
public bool ValidateUser()
{
var credui = new CREDUI_INFO
{
pszCaptionText = CaptionText,
pszMessageText = MessageText
};
credui.cbSize = Marshal.SizeOf(credui);
uint authPackage = 0;
IntPtr outCredBuffer;
uint outCredSize;
bool save = false;
const int loginErrorCode = 1326; //Login Failed
var authError = 0;
while (true)
{
var result = CredUIPromptForWindowsCredentials(ref credui,
authError,
ref authPackage,
IntPtr.Zero,
0,
out outCredBuffer,
out outCredSize,
ref save,
1 /* Generic */);
var usernameBuf = new StringBuilder(100);
var passwordBuf = new StringBuilder(100);
var domainBuf = new StringBuilder(100);
var maxUserName = 100;
var maxDomain = 100;
var maxPassword = 100;
if (result == 0)
{
if (CredUnPackAuthenticationBuffer(0, outCredBuffer, outCredSize, usernameBuf, ref maxUserName,
domainBuf, ref maxDomain, passwordBuf, ref maxPassword))
{
//TODO: ms documentation says we should call this but i can't get it to work
//SecureZeroMem(outCredBuffer, outCredSize);
//clear the memory allocated by CredUIPromptForWindowsCredentials
CoTaskMemFree(outCredBuffer);
var networkCredential = new NetworkCredential()
{
UserName = usernameBuf.ToString(),
Password = passwordBuf.ToString(),
Domain = domainBuf.ToString()
};
//Dummy Code replace with true User Validation
if (networkCredential.UserName == "Bo" && networkCredential.Password == "1234")
return true;
else //login failed show dialog again with login error
{
authError = loginErrorCode;
}
}
}
else return false;
}
}
}
App.xaml.cs
protected override void OnStartup(StartupEventArgs e)
{
var windowsSecurityDialog = new WindowsSecurityDialog
{
CaptionText = "Enter your credentials",
MessageText = "These credentials will be used to connect to YOUR APP NAME";
};
if (windowsSecurityDialog.ValidateUser())
base.OnStartup(e);
}
Ich denke, es ist besser, eine benutzerdefinierte Form dafür zu machen. Einfach zu verwalten und weniger kompliziert. –
Ich habe eigentlich schon ein benutzerdefiniertes Formular, möchte nur sehen, ob es möglich ist, Windows zu verwenden. Auch meiner ist nicht der beste Blick :-) – gulbaek
Und von "nicht das beste Aussehen", meinen Sie, es ähnelt nicht dem Windows-Sicherheitsdialog genug, um den Benutzer zu täuschen. – SPE