C#实现Check Password和锁定输错密码锁定账户功能

银行卡大家都使用,在密码输错超过限制次数之后,就容易被锁死,智能到银行柜台才能解锁,那么这一功能如果实现的呢,今天小编通过实例代码给大家详细讲解,一起跟随小编看看吧。

C#实现的Check Password,并根据输错密码的次数分情况锁定账户:如果输入错误3次,登录账户锁定5分钟并提示X点X分后重试登录。如果5分钟后再次输入,累计输入错误密码累计达到5次。则账户会被永久锁定,需联系系统管理员进行把数据库中的输入错误的次数(errorcount)进行清零解锁才能登陆。实现代码如下:

 public class UserInfo1
 {
  public string Error_count { get; set; }
  public string Error_time { get; set; }
 } 

 public ExecutionResult CheckAccountPwd(string account, string password)
  {
   ExecutionResult execRes;
   execRes = new ExecutionResult();

   string[] strs = account.Split(new string[] { "\\" }, StringSplitOptions.RemoveEmptyEntries);
   if (strs.Length < 2)
   {
    execRes.Status = false;
    execRes.Message = "无效的账号。";
   }
   else
   {
    UserInfo1 info1 = null;
    execRes = CallEEPMethod.Execute(dbName, "sDEM2131", "GetUserInfo", strs[1].ToLower());
    if (execRes.Status && execRes.Anything != null)
    {
     info1 = JsonConvert.DeserializeObject<UserInfo1>(execRes.Anything.ToString());
     if (info1 != null)
     {
      int errcount = Convert.ToInt32(info1.Error_count);
      DateTime errtime = Convert.ToDateTime(info1.Error_time);
      if (errcount != 5)
      {
       //int errorCount
       DateTime dt0 = DateTime.Now;
       DateTime dt1 = errtime.AddMinutes(5);
       double s = (dt1 - dt0).TotalSeconds;
       if (errcount == 3 && s > 0)
       {
        execRes.Status = false;
        execRes.Message = "密码连续输入错误3次,请于 " + errtime.AddMinutes(+5).ToString("yyyy-MM-dd HH:mm:ss") + " 之后重试,thanks!";
       }
       else
       {
        if (CheckFromLDAP(strs[1], password, strs[0]))
        {
         CPU.Models.UserInfo userInfo = CheckUser(strs[1]);
         if (userInfo == null)
         {
          execRes.Status = false;
          execRes.Message = "您没有权限操作此系统!";
         }
         else
         {
          execRes.Status = true;
          execRes.Anything = userInfo;
          //error count 清0
          CallEEPMethod.Execute(dbName, "sDEM2131", "UpdateUserLoginError", strs[1].ToLower() + ","+"0" + "," + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));

         }
        }
        else
        {
         execRes.Status = false;
         // 次数+1
         if (errcount + 1 > 1)
          execRes.Message = "密码连续输入错误" + (errcount+1).ToString() + "次。密码连续输错5次将锁定!";
         else
          execRes.Message = "密码输入错误!";
         dt0 = DateTime.Now;
         CallEEPMethod.Execute(dbName, "sDEM2131", "UpdateUserLoginError", strs[1].ToLower() + "," + (errcount + 1).ToString()+"," + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
         if (errcount + 1 == 3)
          execRes.Message = "密码连续输入错误" + (errcount + 1).ToString() + "次,请于 " + dt0.AddMinutes(5).ToString("yyyy-MM-dd HH:mm:ss") + " 之后重试,thanks!";
         if (errcount + 1 == 5)
          execRes.Message = "账号密码连续输入错误5次,已锁定!请联系管理员解锁,thanks!";
        }
       }
      }
      else
      {
       execRes.Status = false;
       execRes.Message = "账号密码连续输入错误5次,已锁定!请联系管理员解锁,thanks!";
      }
     }
     else
     {
      execRes.Status = false;
      execRes.Message = "找不到此账号,请重新输入!";
     }
    }
    else
    {
     execRes.Status = false;
     execRes.Message = "找不到此账号,请重新输入!";
    }
   }
   return execRes;
  }

根据登录不同的网域进行Form验证

 private bool CheckFromLDAP(string ntID, string ntPWD, string domain)//根据登录的不同网域进行Form验证
  {
   bool result = false;
   string strUser;
   try
   {
    strUser = domain + "\\" + ntID;
    if (domain.ToLower().Equals("gi"))
     domain = "gi.compal.com";
    else if (domain.ToLower().Equals("cqc_cci"))
     domain = "10.140.1.1";
    else if (domain.ToLower().Equals("vn"))
     domain = "10.144.2.101";
    else if (domain.ToLower().Equals("njp_cci"))
     domain = "10.128.50.1";
    else
     domain = "compal.com";
    DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, strUser, ntPWD);
    using (DirectorySearcher searcher = new DirectorySearcher(entry))
    {
     searcher.Filter = string.Format("(&(objectClass=user)(sAMAccountName={0}))", ntID);
     SearchResult sr = searcher.FindOne();
     using (SearchResultCollection results = searcher.FindAll())
     {
      if (results.Count > 0)
      {
       //if (results[0].Properties.Contains("employeeID"))
       // empID = results[0].Properties["employeeID"][0].ToString();
       //else
       // empID = results[0].Properties["extensionattribute3"][0].ToString();
       result = true;
      }
     }
    }
   }
   catch (Exception ex)
   {
    //LogHelper.Error(ex.Message);
   }

   return result;
  }

根据不同的用户登录进行权限管理

public bool CheckPermission(string controllerName, string actionName,string plant, string userID)
  {
   bool result = false;
   //if (actionName.StartsWith("_"))
   // actionName = actionName.Substring(1);
   UserInfo userInfo = CheckUser(userID);
   if (userInfo!=null)
   {
    if (controllerName == "Home")
     result = true;
    else if (userInfo.Permissions.Contains(controllerName))
    {
     if (!string.IsNullOrEmpty(plant))
     {
      if (userInfo.PlantCode.ToLower() == plant.ToLower() || userInfo.PlantCode == "ALL")
       result = true;
     }
     else
      result = true;
    }
   }
   return result;
  }

总结

以上所述是小编给大家介绍的C#实现Check Password和锁定输错密码锁定账户功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

时间: 2020-01-19

C#实现将程序锁定到Win7任务栏的方法

本文实例讲述了C#实现将程序锁定到Win7任务栏的方法.分享给大家供大家参考.具体实现方法如下: Win7Taskbar类: using System; using System.Collections.Generic; using System.Text; using Shell32; using System.IO; namespace TestWin7Taskbar { class Win7Taskbar { public static bool LockApp(bool isLock,

C#检查键盘大小写锁定状态的方法

本文实例讲述了C#检查键盘大小写锁定状态的方法.分享给大家供大家参考.具体分析如下: 1.命名空间: using System.Runtime.InteropServices; 2.导入方法 [DllImport("user32.dll", EntryPoint = "GetKeyboardState")] public static extern int GetKeyboardState(byte[] pbKeyState); 3.大小写状态 public sta

Android中检查、监听电量和充电状态的方法

当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始. 电池寿命通过剩余电量和充电状态来影响应用更新的执行.当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快.如果设备不在充电,降低更新频率可以帮助延长电池寿命. 类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新. 注:此处的更新,指的是类似发送心跳包的动作,或者定时更新内容.并非仅仅指更新应用版本.如果是用户动作,比如翻页刷新,

jQuery基于ajax实现页面加载后检查用户登录状态的方法

本文实例讲述了jQuery基于ajax实现页面加载后检查用户登录状态的方法.分享给大家供大家参考,具体如下: 拥有会员功能的网站,如果会员已经登录,那么要显示相应的登录状态,而且这种显示的需求是在网站的每个页面都有的(目前国内网站貌似都是这么做的,还没有见过其他形式的状态显示方式),这样,在打开一个新的页面时就要知道这个会员是否已经登录,需要判断登录的状态. 1.解决方案. 为了能够实现在每一个页面判断会员登录状态的功能,我采用了页面时通过ajax传递参数通过后端返回的登录状态结果进行判断,当然

Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法

本文实例讲述了Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法.分享给大家供大家参考,具体如下: 首先在Mainifest.xml的Activity元素中加入android:configChanges="orientation|keyboardHidden"属性 <activityandroid:name=".FileBrowser"android:label="@string/app_name"android:

php在linux下检测mysql同步状态的方法

本文实例讲述了php在linux下检测mysql同步状态的方法.分享给大家供大家参考.具体分析如下: 这里通过两个实例来介绍mysql同步状态检测实现方法.代码如下: 复制代码 代码如下: #!/bin/sh     #check MySQL_Slave Status  #crontab time 00:10  MYSQL_USER="root" MYSQL_PWD="123456" MYSQL_SLAVE_LOG="/tmp/check_mysql_sl

Android编程之判断SD卡状态的方法

本文实例讲述了Android编程之判断SD卡状态的方法.分享给大家供大家参考,具体如下: 首先我们要在AndroidManifest.xml中增加SD卡访问权限: <!-- 在SDCard 的挂载权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 往SDCard写入数据权限 --> <uses-permission

图像替换新技术 状态域方法

参看Dave Shea's excellent summary ,Paul Young在分析现存的所有方法的优缺点之后,提出了一种新的方法,并将其命名为"状态域方法"(The StateMethod),本文将详细介绍该方法的原理: 该方法检查图片是否禁用,并不是请求服务器上的图片,因为那样会导致一次额外的http请求.作者创建了一个巧妙的方法. 在大多数浏览器中,Image对象可以实例化并追溯到一个无效的URL(http://0),这样很容易检测Image的状态.如果禁用,onerro

Android开发中使用外部应用获取SD卡状态的方法

本文实例讲述了Android开发中使用外部应用获取SD卡状态的方法.分享给大家供大家参考,具体如下: 先来看看常规获取SD卡状态的方法 if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // sd card 可用 }else { // 当前不可用 } Environment.MEDIA_MOUNTED // sd卡在手机上正常使用状态 Environment.MEDIA_UNMOUNTE

android获取监听SD Card状态的方法

本文实例讲述了android获取监听SD Card状态的方法.分享给大家供大家参考.具体分析如下: 1. 注册StorageEventListener来监听SD卡状态即onStorageStateChanged()方法,当sd卡状态改变时,调用该方法. 复制代码 代码如下: public void onStorageStateChanged(String path,String oldState,String newState){ if (newState.equals(Environment.

java检查服务器的连通两种方法代码分享

首先要了解一下ping的内容. 概述 PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序.Ping发送一个ICMP(Internet Control Messages Protocol)即因特网信报控制协议:回声请求消息给目的地并报告是否收到所希望的ICMPecho (ICMP回声应答).它是用来检查网络是否通畅或者网络连接速度的命令.作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:利用