一个简单的WPF身份验证

use*_*275 1 authentication wpf

如何为WPF应用程序创建简单的WPF身份验证?例如:用户首次注册然后登录.用户登录名和密码应保存为txt文件(加密).如果身份验证过程成功,那么它应该重定向到另一个现有窗口.

我是WPF的初学者.我搜索过这个问题,但没找到我需要的东西.我需要一个简单的,一步一步解释如何做到这一点.

提前致谢!:)

Arc*_*ald 19

我也在学习,为了锻炼一下,我为你创造了一个非常简单的例子.这可能是不专业和不安全的,但我认为(希望)有可能以某种方式扩展它:).

首先,您需要创建简单的WPF窗口(使用txt/btn +名称命名约定):

视窗

对于两个窗口添加

using System.IO;
Run Code Online (Sandbox Code Playgroud)

然后,您需要为按钮添加事件并修改两个窗口的代码:

public partial class LoginWindow : Window
{
    public LoginWindow()
    {
        InitializeComponent();
    }
    // This is really bad/weak encryption method
    String WeakDecryptMethod(String textIn)
    {
        Char[] temp = textIn.ToArray<Char>();
        for (int i = 0; i < textIn.Length; i++)
        {
            temp[i] = (char)((int)temp[i] - 3);
        }
        return new String(temp);
    }
    private void btnRegister_Click(object sender, RoutedEventArgs e)
    {
        RegisterWindow newWindow = new RegisterWindow();
        newWindow.ShowDialog();
    }
    private void btnOK_Click(object sender, RoutedEventArgs e)
    {
        // If file exist and login and password are "correct"
        if (File.Exists("Users.txt") 
            && txtLogin.Text.Length >= 4 
            && txtPass.Text.Length >= 4)
        {
            using (StreamReader streamReader = new StreamReader("Users.txt"))
            {
                // While there is something in streamReader read it
                while (streamReader.Peek() >= 0)
                {
                    String decryptedLogin = WeakDecryptMethod(streamReader.ReadLine());
                    String decryptedPass = WeakDecryptMethod(streamReader.ReadLine());
                    if (decryptedLogin == txtLogin.Text && decryptedPass == txtPass.Text)
                    {
                        ProtectedWindow protectedWindow = new ProtectedWindow();
                        this.Close();
                        protectedWindow.Show();
                        break;
                    }
                }
            }
        }
    }
    private void btnCancel_Click(object sender, RoutedEventArgs e)
    {
        this.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

和注册窗口的代码:

public partial class RegisterWindow : Window
{
    public RegisterWindow()
    {
        InitializeComponent();
    }
    // This is really bad/weak method to encrypt files
    String WeakEncryptMethod(String textIn)
    {
        Char[] temp = textIn.ToArray<Char>();

        for (int i = 0; i < textIn.Length; i++)
        {
            temp[i] = (char)((int)temp[i] + 3);
        }
        return new String(temp);
    }
    private void btnRegister_Click(object sender, RoutedEventArgs e)
    {
        // If file exist and login and password are "correct"
        if (File.Exists("Users.txt") 
            && txtLogin.Text.Length >= 4 
            && txtPass.Text.Length >= 4 
            && txtPass.Text == txtPassCheck.Text)
        {
            StringBuilder stringBuilder = new StringBuilder();
            using (StreamReader streamReader = new StreamReader("Users.txt"))
            {
                stringBuilder.Append(streamReader.ReadToEnd());
            }
            using (StreamWriter streamWriter = new StreamWriter("Users.txt"))
            {
                streamWriter.Write(stringBuilder.ToString());
                streamWriter.WriteLine(WeakEncryptMethod(txtLogin.Text));
                streamWriter.WriteLine(WeakEncryptMethod(txtPass.Text));
            }
            this.Close();
        }
    }
    private void btnCancel_Click(object sender, RoutedEventArgs e)
    {
        this.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

为了工作应用程序需要访问文件"Users.txt",它需要放在同一个文件夹中.

笔记:

  1. 如果你将使用一些适当的加密函数并且可能为它创建单独的类将会更好.此外,我几乎可以肯定,它将无法正常使用包含ASCII表末尾最后3个字符的登录名和密码.
  2. 在我看来,将登录名和密码数据存储在*.txt文件中是个坏主意:).
  3. 据我所知,C#代码很容易进行逆向工程,因此以某种方式隐藏加密/解密部分可能会更好.我不太了解它,但你可以在这里阅读更多内容,谷歌叔叔可能会提供帮助.
  4. 代码非常简单,可能有很多扩展它的可能性(更多文件处理的东西,TextBox验证正确的输入和密码强度计算)
  5. 如果有更专业的人会检查我的代码会很高兴,请随意投票; P(当然评论中有建设性的批评者:)).

  • 有人真的花了这么多精力来回答一个更像是代码请求的问题,那么实际的问题每天都会得到我的投票! (5认同)