在aspnet_membership上创建触发器会导致登录失败

时间:2011-09-28 13:28:00

标签: tsql webforms asp.net-membership dotnetnuke

我在一个旧的Web应用程序上做了一些维护,我们有2个DB。一个用于WWW前端(DotNetNuke),另一个用于管理员后端。这两个应用程序都为用户使用aspnet_membership,我们希望在应用程序之间同步登录。我以为我们会用触发器执行此操作,但是当我添加触发器时登录开始失败。

USE dnnTicket
GO 

CREATE TRIGGER update_membership ON dbo.aspnet_Membership 
    AFTER UPDATE
AS
SET NOCOUNT ON   
    IF (trigger_nestlevel() > 1) RETURN --Make sure a similar trigger on the other db don't cause infinite loops. 
    UPDATE ticket4you.dbo.aspnet_Membership SET 
              [Password] = INSERTED.[Password],
              PasswordFormat = INSERTED.PasswordFormat,
              PasswordSalt = INSERTED.PasswordSalt,
              MobilePIN = INSERTED.MobilePIN,
              Email = INSERTED.Email,
              LoweredEmail = INSERTED.LoweredEmail,
              PasswordQuestion = INSERTED.PasswordQuestion,
              PasswordAnswer = INSERTED.PasswordAnswer ,
              IsApproved = INSERTED.IsApproved ,
              IsLockedOut = INSERTED.IsLockedOut ,
              CreateDate = INSERTED.CreateDate ,
              LastLoginDate = INSERTED.LastLoginDate ,
              LastPasswordChangedDate = INSERTED.LastPasswordChangedDate,
              LastLockoutDate = INSERTED.LastLockoutDate ,
              FailedPasswordAttemptCount = INSERTED.FailedPasswordAttemptCount ,
              FailedPasswordAttemptWindowStart = INSERTED.FailedPasswordAttemptWindowStart ,
              FailedPasswordAnswerAttemptCount = INSERTED.FailedPasswordAnswerAttemptCount ,
              FailedPasswordAnswerAttemptWindowStart = INSERTED.FailedPasswordAnswerAttemptWindowStart 
    FROM  INSERTED 
    WHERE ticket4you.[dbo].aspnet_Membership.UserId = INSERTED.userID 
SET NOCOUNT OFF 
GO       

使用dnnTicket db在数据库登录中使用此触发器失败。

我尽可能地跟踪SQL服务器活动,发现在从Web服务器运行查询到我从SMMS运行相同查询时的跟踪中有一个非常奇怪的区别。

This is the trace I get when the login is run from DotNetNuke

This is the trace I get when running the same query from SQL server management studio

1 个答案:

答案 0 :(得分:2)

一目了然,触发器看起来还不错。

我首先检查两个应用程序是否具有相同的成员资格提供程序配置和相同的机器密钥。

然后我会查找可能被记录的任何错误消息。 DNN事件查看器(以及6.0中的log4net日志文件)是很好的来源。如果没有,我会使用sql profiler查找与触发/登录过程相关的任何消息。

您还可以更详细地描述失败吗?触发器是否阻止登录到两个系统,或者您是否可以登录到系统A,但不能登录到系统B,或者您只能访问一个系统?