ALTER PROCEDURE dbo.aspnet_Membership_GetPassword --获取密码
@ApplicationName NVARCHAR(256),
@UserName NVARCHAR(256),
@MaxInvalidPasswordAttempts INT,
@PasswordAttemptWindow INT,
@TimeZoneAdjustment INT,
@PasswordAnswer NVARCHAR(128) = NULL
AS
BEGIN
DECLARE @UserId UNIQUEIDENTIFIER
DECLARE @PasswordFormat INT
DECLARE @Password NVARCHAR(128)
DECLARE @passAns NVARCHAR(128)
DECLARE @IsLockedOut BIT
DECLARE @LastLockoutDate DATETIME
DECLARE @FailedPasswordAttemptCount INT
DECLARE @FailedPasswordAttemptWindowStart DATETIME
DECLARE @FailedPasswordAnswerAttemptCount INT
DECLARE @FailedPasswordAnswerAttemptWindowStart DATETIME

/**//*声明一大堆的变量*/

DECLARE @ErrorCode INT
SET @ErrorCode = 0

DECLARE @TranStarted BIT
SET @TranStarted = 0

IF( @@TRANCOUNT = 0 )----若当前活动事务为0,开始事务
BEGIN
BEGIN TRANSACTION
SET @TranStarted = 1 --设置事务参数为1
END
ELSE
SET @TranStarted = 0

DECLARE @DateTimeNowUTC DATETIME --声明当前标准时间
EXEC dbo.aspnet_GetUtcDate @TimeZoneAdjustment, @DateTimeNowUTC OUTPUT

/**//*调用存储过程。第一个参数在存储过程中好象没用到,哪里用呢?-_-!*/

SELECT @UserId = u.UserId,
@Password = m.Password,
@passAns = m.PasswordAnswer,
@PasswordFormat = m.PasswordFormat,
@IsLockedOut = m.IsLockedOut,
@LastLockoutDate = m.LastLockoutDate,
@FailedPasswordAttemptCount = m.FailedPasswordAttemptCount,
@FailedPasswordAttemptWindowStart = m.FailedPasswordAttemptWindowStart,
@FailedPasswordAnswerAttemptCount = m.FailedPasswordAnswerAttemptCount,
@FailedPasswordAnswerAttemptWindowStart = m.FailedPasswordAnswerAttemptWindowStart
FROM dbo.aspnet_Applications a, dbo.aspnet_Users u, dbo.aspnet_Membership m WITH ( UPDLOCK )
WHERE LOWER(@ApplicationName) = a.LoweredApplicationName AND
u.ApplicationId = a.ApplicationId AND
u.UserId = m.UserId AND
LOWER(@UserName) = u.LoweredUserName


/**//*又是aspnet_Applications/aspnet_Users/aspnet_Membership三表连接查询,条件为
输入参数@UserName/@ApplicationName*/

IF ( @@rowcount = 0 )---返回受上一语句影响的行数,即无结果就回滚
BEGIN
SET @ErrorCode = 1
GOTO Cleanup
END

IF( @IsLockedOut = 1 )--是否锁住,如果是也回滚(锁定用户当然不让操作……)
BEGIN
SET @ErrorCode = 99
GOTO Cleanup
END

IF ( NOT( @PasswordAnswer IS NULL ) ) --如果密码提示问题不为空(干嘛那样写?和前面的区别吗?)
BEGIN
IF( ( @passAns IS NULL ) OR ( LOWER( @passAns ) <> LOWER( @PasswordAnswer ) ) )

/**//*如果此用户的密码提示问题为空或者密码提示问题不为输入的密码提示问题*/
BEGIN
IF( @DateTimeNowUTC > DATEADD( minute, @PasswordAttemptWindow, @FailedPasswordAnswerAttemptWindowStart ) )

/**//*如果当前时间大于计算出来的时间,如下*/

/**//*就是当打开密码提示问题窗口失败的时间的分钟数上加上@PasswordAttemptWindow参数的值*/

/**//*参照DATEADD函数*/
BEGIN
SET @FailedPasswordAnswerAttemptWindowStart = @DateTimeNowUTC --密码失败尝试窗口打开时间
SET @FailedPasswordAnswerAttemptCount = 1
END

/**//*这时间计算还真有点乱,-_-!!*/
ELSE
BEGIN
SET @FailedPasswordAnswerAttemptCount = @FailedPasswordAnswerAttemptCount + 1
SET @FailedPasswordAnswerAttemptWindowStart = @DateTimeNowUTC
END

BEGIN
IF( @FailedPasswordAnswerAttemptCount >= @MaxInvalidPasswordAttempts )
BEGIN
SET @IsLockedOut = 1
SET @LastLockoutDate = @DateTimeNowUTC
END

/**//*如果尝试次数超过限制,则锁定用户,并设置最近锁定时间为当前时间*/
END

SET @ErrorCode = 3
END
ELSE
BEGIN
IF( @FailedPasswordAnswerAttemptCount > 0 )

/**//*如果密码问题存在,但是尝试次数大于0*/
BEGIN
SET @FailedPasswordAnswerAttemptCount = 0
SET @FailedPasswordAnswerAttemptWindowStart = CONVERT( DATETIME, '17540101', 112 )
END
---好象是还原为初值了
END

UPDATE dbo.aspnet_Membership
SET IsLockedOut = @IsLockedOut, LastLockoutDate = @LastLockoutDate,
FailedPasswordAttemptCount = @FailedPasswordAttemptCount,
FailedPasswordAttemptWindowStart = @FailedPasswordAttemptWindowStart,
FailedPasswordAnswerAttemptCount = @FailedPasswordAnswerAttemptCount,
FailedPasswordAnswerAttemptWindowStart = @FailedPasswordAnswerAttemptWindowStart
WHERE @UserId = UserId

/**//*更新数据表*/
IF( @@ERROR <> 0 )
BEGIN
SET @ErrorCode = -1
GOTO Cleanup
END
END

IF( @TranStarted = 1 )
BEGIN
SET @TranStarted = 0
COMMIT TRANSACTION
END

IF( @ErrorCode = 0 )
SELECT @Password, @PasswordFormat

/**//*如果错误代码为0,则返回密码和格式化的密码(这里才是主要的东西)*/
RETURN @ErrorCode

Cleanup:

IF( @TranStarted = 1 )
BEGIN
SET @TranStarted = 0
ROLLBACK TRANSACTION
END

RETURN @ErrorCode

END

posted on
2006-08-30 09:18
MainIsUsed
阅读(
883)
评论()
编辑
收藏
举报
|
30 |
31 |
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
点击右上角即可分享
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
· 对象命名为何需要避免'-er'和'-or'后缀
· JDK 24 发布,新特性解读!
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· SQL Server如何跟踪自动统计信息更新?