C#实现密码验证与输错密码账户锁定
作者:農碼一生 发布时间:2022-04-05 13:22:22
标签:C#,密码,验证,账户,锁定
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;
}
来源:https://www.cnblogs.com/wml-it/p/12205676.html


猜你喜欢
- SpringBoot配置https(SSL证书)最近在做微信小程序,https是必须条件仅需三步SpringBoot2.x版本对比一下这个小
- 导语本章根据百度地图API,实现仿钉钉打卡功能。用到了基础地图、覆盖物、定位图层、陀螺仪方法、悬浮信息弹框。百度地图API地址
- /// <summary>/// 获取数据缓存/// </summary>/// <param name=&q
- string filePath = @"E:\Randy0528\中文目录\JustTest.rar"; &n
- 今天我做的是一个自定义刻度尺控件,由于项目需求需要使用刻度尺那样滑动选择,由于对自定义控件的认识还不够深入,于是花了一周多时间才把这个控件给
- 现在很多app一打开就是一个ViewPager,然后可以用手指滑,每滑一次就换一张图,底下还会有圈圈表示说现在滑到第几章~通常这些图片都是放
- 虽然闭包主要是函数式编程的玩意儿,而C#的最主要特征是面向对象,但是利用委托或lambda表达式,C#也可以写出具有函数式编程风味的代码。同
- 1、心跳机制简介在分布式系统中,分布在不同主机上的节点需要检测其他节点的状态,如服务器节点需要检测从节点是否失效。为了检测对方节点的有效性,
- 实例如下:package com.ljq.util;import java.beans.BeanInfo;import java.beans
- 一、信号量(Semaphore)信号量(Semaphore)是由内核对象维护的int变量,当信号量为0时,在信号量上等待的线程会堵塞,信号量
- C++ 中String 替换指定字符串的实例详解C++的string提供了replace方法来实现字符串的替换,但是对于将字符串中某个字符串
- 前言本文主要给大家介绍的是关于Java通过Class类获取Class对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的
- 本篇超级详细案例截图教学 IDEA如何运行SpringBoot项目,图片点击可放大仔细看Java编译工具以及环境准备:IDEA JDK1.8
- 线程组我们可以把线程归属到某个线程组中,线程组可以包含多个线程以及线程组,线程和线程组组成了父子关系,是个树形结构,如下图:使用线程组可以方
- 本文实例讲述了Java之JFrame输出Helloworld的方法。分享给大家供大家参考。具体如下:JAVA的GUI程序的基本思路是以JFr
- 本文实例为大家分享了JS Struts2多文件上传的具体代码,供大家参考,具体内容如下1、JSP页面: JS控制增加删除多个上传文件框,代码
- 前言Exchange(交换器)顾名思义,它是用来实现两个线程间的数据交换的,它诞生于 JDK 1.5,它有两个核心方法:exchange(V
- webservice restful接口跟soap协议的接口实现大同小异,只是在提供服务的类/接口的注解上存在差异,具体看下面的代码,然后自
- Parallel类是对线程的抽象,提供数据与任务的并行性。类定义了静态方法For和ForEach,使用多个任务来完成多个作业。Paralle
- vs2005中总是保留最近打开的项目和文件的记录,甚至是以删除的它也不删,-_-!下面介绍几种删除的方法:第一种:建立一个bat文件,以后双