登录c#的基本计数器

时间:2015-09-25 06:24:24

标签: c# .net

我坚持使用登录计数器来跟踪某人尝试登录的次数。 (尝试失败)

我来自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
}

2 个答案:

答案 0 :(得分:1)

看起来你已经有一个名为" Tag_LoginCount"定义。我认为它是一个整数。您可以在“跟踪代码管理器”中检查现有代码并添加新代码。

我考虑添加更多标签:

  • FailedLogins(整数)
  • TimeOfFirstLogin(DateTime)
  • UserLockedOut(布尔)
  • UserLockoutStart(DateTime)

要在脚本中使用标记,只需在标记名称前加上美元符号(例如$ 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
        }
    }
}

我认为这并不完全是你想要的,因为有效和无效的登录尝试之间没有区别,但你应该能够弄清楚如何调整这个例子。