我正在尝试将一个标识工作人员的变量从他们的登录详细信息传递到下一个屏幕以填充测试者ID框。
我是否会更好地使用全局变量,然后在设置下一个屏幕时读取该变量,或者我是否可以将其放入变量并将其发送到下一个屏幕?
登录代码如下:
public Login()
{
InitializeComponent();
}
private void LoginButton_Click(object sender, EventArgs e)
{
String Username1 = StaffUsername.Text;
String Password1 = StaffPassword.Text;
String HardUser = "Test";
String HardPass = "Merlin123";
if (Username1 == "" && Password1 == "")
{
MessageBox.Show("Please Enter Login Id and Password");
}
else
{
if (Username1.Equals(HardUser) && Password1.Equals(HardPass))
{
this.Hide();
AddingClients M1 = new AddingClients();
M1.Show();
}
else{
this.Hide();
Login Lg = new Login();
Lg.Show();
MessageBox.Show("Incorrect Username or Password Entered");
}
}
}
}
}
我现在正在使用硬编码的用户名和密码,但在实际程序中,我会在数据库上进行此调用并比较用户名和密码,然后进入下一个屏幕。
使用登录操作引发到下一个屏幕的全局变量会更好,或者更容易获得下一个屏幕读取的变量,然后填充所需的文本框?我该怎么做呢?
由于
答案 0 :(得分:1)
您这样做的方法是使用Thread.CurrentPrincipal
。
一旦确认用户是他们所说的人,您就可以:
private static void SignUserIn(string userName)
{
GenericIdentity identity = new GenericIdentity(userName, null);
Thread.CurrentPrincipal = new GenericPrincipal(identity);
}
然后,只要您需要userName,就可以使用Thread.CurrentPrincipal.Identity.Name
。
为了进一步扩展这一点,最好稍微抽象一下,这样你就可以交换进出供应商,例如您可能希望使用Windows身份验证。
所以你可以这样做:
public interface IAuthenticator
{
bool IsValidUser ( string username, string password );
IPrincipal SignInUser ( string username );
void SignOutCurrentUser();
}
public class DbAuthenticator : IAuthenticator
{
public bool IsValidUser ( string username, string password )
{
// Check user here and return bool if valid
}
public void SignInUser(string userName, string[] roles = null)
{
GenericIdentity identity = new GenericIdentity(userName, roles);
Thread.CurrentPrincipal = new GenericPrincipal(identity);
return Thread.CurrentPrincipal;
}
public void SignOutUser()
{
Thread.CurrentPrincipal = WindowsPrincipal.GetCurrent();
}
}
然后在您的代码中,使用某种DI模式注入验证器。所以MEF会是这样的:
[Export(typeof(IAuthenticator))]
public interface IAuthenticator { }
以你的形式:
[Import]
internal IAuthenticator authenticator;
private static void SignUserIn(string userName)
{
authenticator.SignUserIn(username);
}
答案 1 :(得分:0)
您应该有一个User对象并将其传递给其他页面和函数。这样他们就变得更容易测试了。
但是您还需要将对象存储在全局某处,以便在需要时可以检索当前登录的用户。问题在于,那段代码依赖于存在/工作的用户存储,但如果它只有一个地方就可以了。
PS:你的头衔应该是:传递用户还是全球存储?