【问题标题】:Limit user to 10 wrong pin code attempts Web Api #将用户限制为 10 次错误的密码尝试 Web Api #
【发布时间】:2017-09-05 21:27:08
【问题描述】:

我一直在开发一个简单的 web api,它接受某个电话号码并返回一个 pin 码。这个想法是,如果密码错误 10 次,我想删除/限制用户登录。可以在 SQL Server 或 c# 代码中完成吗? 感谢所有帮助

在业务层验证:

    public void validate(validateRequest vReq, headers head, ref validateResponse vRes)
    {
        vRes = new validateResponse();
        int isCorrect = vRes.isCorrect;

        Data dal = new Data();
        dal.OpenConnection();
        dal.valpinCode(vReq.pinCode, ref isCorrect);
        if (isCorrect == 1)
        {
            vRes.result.code = 0;
            vRes.result.message = "Successful";
            vRes.isCorrect = 0;
        }
        else
        {
            vRes.result.code = -3;
            vRes.result.message = "Access Denied.";
            vRes.isCorrect = -1;
        }

我在数据层中的 valpincode:

 public void valpinCode(string pinCode, ref int isCorrect)
    {
        try
        {
            using (IDbConnection db = new SqlConnection(c.connstr))
            {
                if (db.State != ConnectionState.Open)
                    db.Open();

                DynamicParameters param = new DynamicParameters();

                param.Add("@pincode", pinCode);

                param.Add("@exist", dbType: DbType.Int32, direction: ParameterDirection.Output);

                con.Execute("valpin", param, commandType: CommandType.StoredProcedure);

                isCorrect = param.Get<Int32>("@exist");

                if (db.State != ConnectionState.Closed)
                    db.Close();
            }
        }
        catch (Exception ex)
        {
           Common log = new Common();
            log.LogError(ex);
        }
    }

我的 valpin SP:

    @pincode nvarchar(50),
@exist bit output
AS
 BEGIN
    IF NOT EXISTS(
    SELECT *
    FROM Users
    WHERE pinCode=@pincode)
BEGIN
    SET @exist=0
END
ELSE
BEGIN 
    SELECT *
    FROM Users
    WHERE pinCode=@pincode
    SET @exist=1
END
END

用户表:

idUser  phone   countrycode   pincode  
1      7006100      961        5716
12     7006107      961        77709

注意密码是随机生成的

【问题讨论】:

  • 绝对可以使用 C# 和/或 SQL 来完成。
  • pin码错误计数是数据,所以应该去SQL server。初始化、递增、重置和使用该计数器的逻辑可以分发到 C#、从 C# 调用的 SQL 查询或 SQL 存储过程,具体取决于您选择的软件架构、数据访问方法和分层。如果您显示您已经与您的问题一起使用的代码,您只会在此处获得有用的答案。
  • 对不起,我用我拥有的代码更新了问题
  • @dlatikay 有没有例子说明它是如何完成的?
  • 几乎没有。但是有了代码,现在我们要去某个地方了。 Users 表是否已经有一个 int 列来跟踪每个用户的 pin 错误计数?您将需要另一种识别用户的方法(电话号码?)并将其传递给存储过程,通过电话号码查找用户,查看 PIN 是否匹配,如果不匹配,更新计数器,如果达到或超过10、设置另一列锁定用户。

标签: c# sql sql-server asp.net-web-api


【解决方案1】:

只执行一次此脚本以添加一列并将所有用户的值设置为零

alter table users
add invalidAttempts int null
;
update users
set invalidAttempts =0
select * from users

此过程验证用户是否不存在 (-1)、用户是否被阻止 (-2) 密码是否错误 (-3) 以及用户是否正常 (0)

任何无效尝试都存储在新字段/列中。如果它的数量达到 10,则用户被阻止。您需要建立另一种方法来解锁它。如果用户未被阻止,则有效登录将重置无效尝试。

ALTER PROCEDURE valpin @idUser INT, @pincode NVARCHAR(50)
AS
BEGIN
  DECLARE @pin VARCHAR(50)
  DECLARE @invalidAtempts INT

  SELECT @pin = pincode, @invalidAtempts = invalidAttempts
  FROM Users
  WHERE idUser = @idUser

  IF @invalidAtempts IS NULL
    RETURN - 1 --User does not exists
END

IF @invalidAtempts >= 10
  RETURN - 2 --blocked

IF @pin = @pincode
BEGIN
  UPDATE users
  SET invalidAttempts = 0
  WHERE idUser = @idUser

  RETURN 0 -- OK
END
ELSE
BEGIN
  UPDATE users
  SET invalidAttempts = invalidAttempts + 1
  WHERE idUser = @idUser

  RETURN - 3 -- wrong ping
END

您需要修改 C# 代码以反映此行为。另外,不要使用输出参数,而是使用返回值ParameterDirection.ReturnValue;

【讨论】:

  • 感谢您的辛勤工作,但它在我的 SP 中不起作用?还有其他建议吗?
  • 抱歉回复晚了。我已经用对我有用的答案更新了问题
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2018-04-22
  • 1970-01-01
  • 2020-11-15
  • 2017-03-01
  • 2018-03-26
  • 2016-04-09
  • 1970-01-01
相关资源
最近更新 更多