【问题标题】:A simple WPF Authentication一个简单的 WPF 身份验证
【发布时间】:2011-06-14 21:36:48
【问题描述】:

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

我是 WPF 的初学者。 我已经搜索过这个问题,但没有找到我需要的。 我需要一个简单的分步说明如何做到这一点。

提前致谢! :)

【问题讨论】:

标签: wpf authentication


【解决方案1】:

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

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

为两个窗口添加

using System.IO;

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

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();
    }
}

注册窗口的代码:

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();
    }
}

为了工作,应用程序需要访问需要放置在同一文件夹中的文件“Users.txt”。

注意事项:

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

【讨论】:

  • 有人真正付出了这么多努力来回答一个更像是代码请求然后实际问题得到我的投票的问题!
  • 反响很好。不过你是对的,将用户名/密码组合存储在 TXT 文件中是一个糟糕的主意。您可能希望将它们存储在某种数据库中(我使用 SQL)并查看该用户的数据库。此外,在更高级的系统中,您通常具有组、角色和权限,它们不仅可以确定用户是否存在并可以登录,还可以确定他是管理员还是普通用户,从而确定他或她能够使用的功能/屏幕查看。无论如何,很好的例子,你得到了我的支持;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 2017-11-12
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多