用户验证登录详细信息是否应在与表单后面的代码不同的类中完成

时间:2011-11-30 14:44:35

标签: c# authentication

我是C#的新手,我正在尝试构建一个应用程序,该应用程序在启动主应用程序窗口之前以简单的用户身份验证开始。

目前,我有一个登录表单,询问域名和用户密码。 然后我使用principalcontext类来验证细节。

以下是在登录表单上单击按钮时调用的代码(输入名称和密码后)

private void validatelogin(object sender, RoutedEventArgs e)
{
  password = passwordBoxICCLogin.Password.ToString();
  username = tbUserName.Text.ToString();

  using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "xxx"))
  {
    bool  isValid = pc.ValidateCredentials(_username, _password);
    if (isValid)
    {
      DevLauncher launch = new DevLauncher();
      launch.Show();
      this.Close();
    }
    else
    { 
      MessageBox.Show("Invalid ID \ Password combination entered");
    }
  }
}

对于你们中间经验丰富的人来说,这可能看起来很基本,但我想实现一个明智,整洁的设计,如果我做对了,那么它就是应用程序其余部分的良好基础。

1)是否所有这些用户身份验证都发生在表单后面的代码中,或者我应该创建一个名为ValidateUser的新类,它处理用户身份验证,并从事件中调用它,ValidateUser返回一个布尔值? 我有一种唠叨的感觉,认证细节不应该直接出现在表格背后的代码上吗?

2)接下来,我在表单后面的代码中设置属性以保存用户名和密码。如果我创建了一个validate用户类,那么这些属性是否应该包含在这个类中?

3)我的NUNIT测试方法是否应该只测试validatecredentials方法返回的布尔值。即assert.equals(True,validatecredentailsobject(用户名,域名) - 或者沿着这些方向的东西?

这再次感觉不太对劲。寻找有关整体设计如何更好的指导,以及编写可在NUNIT中测试的方法。

我想首先开发编写nunit测试的应用程序的其余部分,然后是方法。

1 个答案:

答案 0 :(得分:0)

您可以在数据库中存储用户名列表(Windows ID),然后使用以下代码获取登录到计算机的用户的用户名,而不是提示输入用户名和密码:

string userName = Environment.UserName.ToLower();

然后将userName与数据库中的内容进行比较。

您可以在InitializeComponent()之前在Form的构造函数中执行此操作:

public partial class Form1 : Form
{
    public Form1()
    {
        string userName = Environment.UserName.ToLower();

        if(isAuthorized(userName)){
            InitializeComponent();
        }
        else {
            MessageBox.Show("You are not authorized");
            Application.Exit();
        }
    }
}

其中isAuthorized是检查用户授权级别的函数。