我是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测试的应用程序的其余部分,然后是方法。
答案 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是检查用户授权级别的函数。