所以我最近一直在修改MembershipProvider Sitecore使用,或者SqlMembershipProvider。微软发布了他们的源代码,所以我把它全部复制了,并添加了一些小的东西,比如密码历史等。在遇到这个奇怪的bug之前,一切似乎都很好。
基本上我将代码添加到登录页面的Login_OnClick事件中,这样如果用户重置了密码并分配了自动生成的密码,则会将其重定向到“更改密码”页面。
代码调用Membership.ValidateUser,后者又调用CheckPassword。如果密码错误或密码尝试失败,则会调用存储过程“dbo.aspnet_Membership_UpdateUserInfo”来更新相关变量(例如FailedPasswordAttemptCount)。 ValidateUser和CheckPassword是SqlMembershipProvider中包含的方法,并且未被我修改。
奇怪的是,相同的代码在同事计算机上正常工作,但在我的计算机上运行存储过程两次。我能够让它停止这样做的唯一方法是从我的Login_OnClick方法中删除此代码,但我不知道为什么修复它,也不知道为什么它在我的同事计算机上工作。
这是违规代码......任何想法?
protected void Login_OnClick(object sender, EventArgs e)
{
string username = ((TextBox) Login.FindControl("UserName")).Text;
string password = ((TextBox) Login.FindControl("Password")).Text;
if (Membership.ValidateUser(username, password))
{
try
{
SqlConnectionHolder holder = null;
SqlDataReader reader = null;
try
{
var _sqlConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["core"].ConnectionString;
holder = SqlConnectionHelper.GetConnection(_sqlConnectionString, true);
SqlCommand cmd = new SqlCommand(@"SELECT * FROM dbo.PasswordReset WHERE " +
"username=@username",
holder.Connection);
cmd.Parameters.AddWithValue("@username", username);
int count = 0;
using (reader = cmd.ExecuteReader())
{
while (reader.Read())
{
count++;
}
}
//results were found in the password reset table so redirect them to the change password page
if (count > 0)
{
Response.Redirect("/sitecore/login/changepassword.aspx");
}
}
finally
{
if (holder != null)
{
holder.Close();
holder = null;
}
}
}
catch
{
throw;
}
}
}
更新:因此,经过测试,我们发现只有当您在用户名中包含域时才会出现该错误。如在,sitecore / admin无法正常工作,但管理员可以。我也发现它绝对不是我的代码问题,因为当我将默认源代码插入SQLMembershipProvider时,我仍然得到相同的错误。默认情况下,Sitecore的全新安装正常工作,即使它仍在使用SQLMembershipProvider。
所以我仍然有点迷失,但显然从源代码编译的SQLMembershipProvider和默认的SQLMembershipProvider sitecore使用的东西有所不同。