我被一个登录计数器卡住了,用它来记录有人尝试登录的次数。(尝试失败)
我来自康耐视的VisionPro Designer,它使用C#和.NET。当在从第一次失败的尝试(比如说5分钟)开始的时间范围内达到最大尝试次数时,密码框将被阻止。
我是个编程新手,只是自学。
当前设置仅为无,程序中内置了用户数据库。
用户名的文本框和密码的Password框(显然)。我对其进行了设置,以便当passwordbox获得更改的值时,它将凭据与用户数据库进行匹配,如果为"true“,则进入高级选项页面。我不希望任何不受信任的机器操作员访问高级设置页面。
程序使用“值标签”,你可以在程序中的任何地方获取或更改值,为登录尝试"Tag_LoginCount“设置一个标签。
下面是passwordbox代码:
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
}
发布于 2015-10-20 13:37:07
看起来您已经定义了一个名为"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
发布于 2015-09-25 16:29:25
根据你的描述,很难说出你在这里可能需要什么。我将假设您提供的代码片段位于处理某些用户输入的事件处理程序中。我将把事件处理程序放在一个类中。为了能够在多次调用处理程序之间保留计数器的值,您需要将计数器的值存储在处理程序之外的某个位置。一种方法是使用类级变量。
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
}
}
}
我认为这并不是您想要的,因为在有效和无效的登录尝试之间没有区别,但是您应该能够弄清楚如何适应这个示例。
https://stackoverflow.com/questions/32776058
复制相似问题