首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >登录c#的基本计数器

登录c#的基本计数器
EN

Stack Overflow用户
提问于 2015-09-25 14:24:24
回答 2查看 441关注 0票数 1

我被一个登录计数器卡住了,用它来记录有人尝试登录的次数。(尝试失败)

我来自康耐视的VisionPro Designer,它使用C#和.NET。当在从第一次失败的尝试(比如说5分钟)开始的时间范围内达到最大尝试次数时,密码框将被阻止。

我是个编程新手,只是自学。

当前设置仅为无,程序中内置了用户数据库。

用户名的文本框和密码的Password框(显然)。我对其进行了设置,以便当passwordbox获得更改的值时,它将凭据与用户数据库进行匹配,如果为"true“,则进入高级选项页面。我不希望任何不受信任的机器操作员访问高级设置页面。

程序使用“值标签”,你可以在程序中的任何地方获取或更改值,为登录尝试"Tag_LoginCount“设置一个标签。

下面是passwordbox代码:

代码语言:javascript
运行
复制
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
}
EN

回答 2

Stack Overflow用户

发布于 2015-10-20 13:37:07

看起来您已经定义了一个名为"Tag_LoginCount“的标记。你可以在“标签管理器”中检查现有的标签并添加新的标签。

我会考虑添加更多的标签:

要在脚本中使用标记,只需在标记名称前加上一个美元符号(例如,$FailedLogins),或者将它们从工具箱拖放到脚本中。

下面的脚本应该能达到您想要的效果:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2015-09-25 16:29:25

根据你的描述,很难说出你在这里可能需要什么。我将假设您提供的代码片段位于处理某些用户输入的事件处理程序中。我将把事件处理程序放在一个类中。为了能够在多次调用处理程序之间保留计数器的值,您需要将计数器的值存储在处理程序之外的某个位置。一种方法是使用类级变量。

代码语言:javascript
运行
复制
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
        }
    }
}

我认为这并不是您想要的,因为在有效和无效的登录尝试之间没有区别,但是您应该能够弄清楚如何适应这个示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32776058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档