我坚持使用登录计数器来跟踪某人尝试登录的次数。 (尝试失败)
我来自Cognex的VisionPro Designer,它使用C#和.NET。 当在第一次尝试失败后的时间范围内达到最大尝试次数(比如说5分钟),密码框将被阻止。
我是编程的初学者,只是自学成才。
当前设置只是none,内置了程序的用户数据库。
用户名的文本框和密码的密码框(显然)。 我进行了设置,所以当密码箱获得更改后的值时,它会与用户数据库中的凭据匹配,如果这样,那么"是"你进入高级选项页面。我不希望任何不受信任的机器操作员到达高级设置页面。
该程序使用"值标签"您可以在程序中获取值或更改值,为loginattempts设置标记" Tag_LoginCount"
这是密码箱代码:
if ($System.Users.Login($Tag_InputUsername, $Tag_InputPassword))
{
$Pages.MainPage.PasswordBox.Password = ""; //Resets the passwordbox password at login
$HMI.ShowPage("LidSettings"); //Opens the Lidsettings page
$Pages.LidSettings.Slider2.Value = 0; //Disables the advanced settings option
}
else
{
$Pages.MainPage.PasswordBox.Password = ""; //resets password
}
答案 0 :(得分:1)
看起来你已经有一个名为" Tag_LoginCount"定义。我认为它是一个整数。您可以在“跟踪代码管理器”中检查现有代码并添加新代码。
我考虑添加更多标签:
要在脚本中使用标记,只需在标记名称前加上美元符号(例如$ FailedLogins),或将它们从工具箱拖放到脚本中。
下面的脚本应该达到你想要的效果:
const int USER_LOCKOUT_PERIOD = 10;
const int MAX_LOGIN_ATTEMPTS = 8;
const int LOGIN_TIMEFRAME = 5;
// Check if user is locked out
int minutesUserLockedOut = (int)DateTime.Now.Subtract($UserLockoutStart).TotalMinutes;
if ($UserLockedOut && (minutesUserLockedOut > USER_LOCKOUT_PERIOD))
{
$UserLockedOut = false;
}
if ($UserLockedOut)
{
int userLockoutMinutesRemaining = (int)(USER_LOCKOUT_PERIOD - minutesUserLockedOut);
$HMI.ShowMessage("Too many failed login attempts. System locked for " + userLockoutMinutesRemaining + " minutes.");
$Pages.MainPage.PasswordBox.Password = ""; //resets password
return;
}
// Reset number of failed logins if first failed login more than LOGIN_TIMEFRAME minutes ago
TimeSpan minutesSinceFirstBadLogin = (int)DateTime.Now.Subtract($TimeOfFirstBadLogin).TotalMinutes;
if (minutesSinceFirstBadLogin > LOGIN_TIMEFRAME)
{
$FailedLogins = 0;
}
if ($System.Users.Login($Tag_InputUsername, $Tag_InputPassword))
{
// Successful login! Reset number of bad logins
$FailedLogins = 0;
$HMI.ShowPage("LidSettings"); //Opens the Lidsettings page
$Pages.LidSettings.Slider2.Value = 0; //Disables the advanced settings option
}
else
{
// If this is the first failed login, record the time
if ($FailedLogins == 0)
{
$TimeOfFirstBadLogin = DateTime.Now;
}
// Increment the number of failed logins
$FailedLogins = $FailedLogins + 1;
// Lock the user out if the number of failed logins exceeds maximum allowed
if ($FailedLogins > MAX_LOGIN_ATTEMPTS)
{
$UserLockedOut = true;
$UserLockoutStart = DateTime.Now;
}
}
$Pages.MainPage.PasswordBox.Password = ""; //resets password
答案 1 :(得分:0)
根据您的描述,很难说出您可能需要的内容。我假设您提供的代码段位于处理某些用户输入的事件处理程序中。我将事件处理程序放在一个类中。为了能够在处理程序的多个调用之间保留计数器的值,您需要将计数器的值存储在处理程序之外的某个位置。一种方法是拥有一个类级变量。
public class C
{
public C()
{
_counter = 0; // initialize the counter when creating a class instance
{
private int _counter;
private void Handler()
{
if (System.Users.Login(Tag_InputUsername, Tag_InputPassword))
{
Pages.MainPage.PasswordBox.Password = ""; //Resets the passwordbox password at login
HMI.ShowPage("LidSettings"); //Opens the Lidsettings page
Pages.LidSettings.Slider2.Value = 0; //Disables the advanced settings option
_counter++; // increment the counter field
}
else
{
Pages.MainPage.PasswordBox.Password = ""; //resets password
}
}
}
我认为这并不完全是你想要的,因为有效和无效的登录尝试之间没有区别,但你应该能够弄清楚如何调整这个例子。