问题描述
||
我在sql Server 2008中遇到一个奇怪的问题,其中存储过程中的某些datetime变量获取的值不正确(1754-01-01)。这是情况的背景/背景:
我正在使用sqlMembershipProvider类在ASP.NET Web应用程序上工作。我使用开箱即用的功能将用户数据存储在数据库中,验证用户名/密码等。我们的应用程序还具有自定义电子签名实现,该实现要求使用一些其他信息(母亲的娘家姓)来验证用户身份,毕业年份等)。
我分两步进行身份验证:首先,我调用Membership.ValidateUser(username,password)进行所有基本检查。如果成功,那么我将调用自定义存储过程进行附加身份验证。如果此其他身份验证失败,我想更新aspnet_Membership数据库表以记录失败---以便用户可以在3次身份验证失败后被锁定,方法与在Membership.ValidateUser中处理失败的登录相同。
我进行了一些研究,确定Membership.ValidateUser方法记录了失败的登录并通过调用aspnet_Membership_UpdateUserInfo存储过程锁定了用户帐户。因此,我决定根据需要从我的自定义身份验证存储过程中调用此存储过程,以增加FailedPasswordAttemptCount列,IsLockedOut等。
问题是,当我直接调用此存储过程时,该存储过程无法从aspnet_Membership表中检索正确的日期时间值(FailedPasswordAttemptwindowStart),以正确地递增FailedPasswordAttemptCount。 UpdateUserInfo存储过程声明一个局部变量,并执行一条select语句以从成员资格表中将该日期时间值检索到局部变量中。无论表中存储了什么值,它检索的日期时间值始终为1754-01-01 00:00:00.000。
我试图弄清楚为什么我不能在此存储过程中从此数据库表中检索正确的datetime值。这是我尝试过的:
在以下情况下检索到不正确的datetime值:
从我的自定义存储过程中调用aspnet_Membership_UpdateUserInfo,然后使用Linq to sql从C#中调用它
使用Linq to sql从我的应用程序直接调用aspnet_Membership_UpdateUserInfo
从我的存储过程或直接从C#调用具有与UpdateUserInfo相同代码的自定义存储过程
在以下情况下,将检索到正确的datetime值:
直接从sql Server Management Studio调用aspnet_Membership_UpdateUserInfo
直接从SSMS调用我的自定义存储过程,后者依次调用aspnet_Membership_UpdateUserInfo
通过Membership.ValidateUser方法调用aspnet_Membership_UpdateUserInfo
有没有人看到过这样的问题,即存储过程从数据库表中选择值1754-01-01而不是正确的值?我真的很想了解为什么会发生这种情况,但是可以采取某种解决方法来完全避免该问题。我真正需要的是一种以相同的方式跟踪失败的用户名和密码以及失败的自定义身份验证尝试的方法,以便在发生太多失败后将用户锁定。
谢谢!
解决方法
标记为已回答。我正在使用Membership.ValidateUser对用户的密码等进行初始检查,然后在此之后立即调用存储过程进行初始身份验证检查和随后的UpdateUserInfo调用。在测试“正确的密码,错误的附加身份验证信息”的用例时,我忘记了最初的ValidateUser调用最终会重置数据库中的FailedPasswordAttemptCount和FailedPassswordAttemptWindowStart值。所以datetime值确实正确地设置为1754-01-01,我正在调用的存储过程没有检索到错误的数据。
我通过删除针对特殊身份验证场景对ValidateUser的调用来解决此问题,而是手动对用户的密码进行哈希处理并将其发送给我的自定义存储过程,以便所有身份验证都一步一步进行,随后对UpdateUserInfo过程。