USP_UPDATE_AND_LOCK_CLIENTUSER
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ClientUserID | int | IN | |
@INFORMATION | nvarchar(1000) | IN |
Definition
Copy
CREATE procedure dbo.USP_UPDATE_AND_LOCK_CLIENTUSER
( @ClientUserID int,
@INFORMATION nvarchar(1000) =null
)
as
begin
set nocount on;
declare @MULTIPLELOCKOUT as int =0;
declare @BRUTEFORCEATTACK as int =0;
declare @BRUTEFORCEINFO as nvarchar(max);
declare @DATETIME as datetime = getutcdate();
declare @CHANGEAGENTID uniqueidentifier
declare @TIMEWINDOWINMINUTES as int = (select Value from dbo.setting where ID = 168)
declare @BRUTEFORCELIMIT as int = (select Value from dbo.setting where ID = 169)
declare @BRUTEFORCEMULTIPLEACCOUNTLOCKOUTDURATION as int = (select Value from dbo.setting where ID = 170)
declare @LASTEVENTRAISEDTIME as datetime =(select UPDATEDATE from dbo.SERVERSTATUS where ID = 5)
--Constants
declare @TIMEWINDOWINMINUTES_MAXVALUE as int = 30;
declare @BRUTEFORCELIMIT_MAXVALUE as int = 10;
declare @BRUTEFORCEMULTIPLEACCOUNTLOCKOUTDURATION_MAXVALUE as int = 30;
if(isnull(@TIMEWINDOWINMINUTES,0) <=0 or @TIMEWINDOWINMINUTES >@TIMEWINDOWINMINUTES_MAXVALUE)
begin
set @TIMEWINDOWINMINUTES = @TIMEWINDOWINMINUTES_MAXVALUE;
end
if(isnull(@BRUTEFORCELIMIT,0)<=0 or @BRUTEFORCELIMIT >@BRUTEFORCELIMIT_MAXVALUE)
begin
set @BRUTEFORCELIMIT = @BRUTEFORCELIMIT_MAXVALUE;
end
if(isnull(@BRUTEFORCEMULTIPLEACCOUNTLOCKOUTDURATION,0) <=0 or @BRUTEFORCEMULTIPLEACCOUNTLOCKOUTDURATION >@BRUTEFORCEMULTIPLEACCOUNTLOCKOUTDURATION_MAXVALUE)
begin
set @BRUTEFORCEMULTIPLEACCOUNTLOCKOUTDURATION = @BRUTEFORCEMULTIPLEACCOUNTLOCKOUTDURATION_MAXVALUE;
end
--Get Change agent
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
--If last event was raised before @TIMEWINDOWINMINUTES mins the reset to current time - @TIMEWINDOWINMINUTES mins WI#1584998
if((select datediff(minute,@LASTEVENTRAISEDTIME, getutcdate())) >@TIMEWINDOWINMINUTES)
begin
set @LASTEVENTRAISEDTIME = dateadd(minute,-1*@TIMEWINDOWINMINUTES,@DATETIME);
end
--If any account locked twice without successful login (lockout time > datelastlogin)
-- If account locked twice in @BRUTEFORCEMULTIPLEACCOUNTLOCKOUTDURATION amount of time
if exists (select 1 from dbo.CLIENTUSERS where ID = @CLIENTUSERID and LASTLOCKEDOUTTIME is not null and LASTLOCKEDOUTTIME > isnull(DATELASTLOGIN,@DATETIME) and datediff(minute,LASTLOCKEDOUTTIME, @DATETIME) <= @BRUTEFORCEMULTIPLEACCOUNTLOCKOUTDURATION)
begin
set @MULTIPLELOCKOUT = 1;
end
--Lock this User's account
update dbo.CLIENTUSERS set LOCKEDOUTTIME = @DATETIME,LASTLOCKEDOUTTIME = @DATETIME, NumFailedAttempts=0 where ID = @ClientUserID;
--Add Account lockout information for Brute force
insert into dbo.CLIENTUSERSFAILEDLOGININFO(CLIENTUSERSID,INFORMATION,DATEADDED,DATECHANGED,ADDEDBYID,CHANGEDBYID)
values(@ClientUserID,isnull(@INFORMATION,''),@DATETIME,@DATETIME,@CHANGEAGENTID,@CHANGEAGENTID)
--If any 10 account locked in last @TIMEWINDOWINMINUTES mins
select @BRUTEFORCEINFO = coalesce(@BRUTEFORCEINFO + INFORMATION, INFORMATION) from dbo.CLIENTUSERSFAILEDLOGININFO
where DATECHANGED > @LASTEVENTRAISEDTIME;
--num of rows selected in Bruteforceinfo query
select @BRUTEFORCEATTACK = case when @@ROWCOUNT >=@BRUTEFORCELIMIT then 1 else 0 end;
select @MULTIPLELOCKOUT as MULTIPLELOCKOUT, @BRUTEFORCEATTACK as BRUTEFORCEATTACKDETECTED, @DATETIME as LASTEVENTTIME, @BRUTEFORCEINFO as BRUTEFORCEINFO;
end