MysqlMembership Membership.ValidateUser Проблема взаимоблокировки при загрузке - PullRequest
0 голосов
/ 04 марта 2012

У меня есть веб-служба WCF с настраиваемым модулем httpModule, который я использую для аутентификации имени пользователя и пароля на MysqlMembership.

public void Init(HttpApplication application)
    {
        application.AuthenticateRequest += new EventHandler(this.OnAuthenticateRequest);
        application.EndRequest += new EventHandler(this.OnEndRequest);
    }

    public void OnAuthenticateRequest(object source, EventArgs eventArgs)
    {
            ...
            ...

            if (Membership.ValidateUser(username, password))
            {

Когда я начал тестировать свою службу, я столкнулся с недоумением.Запросы случайным образом терпят неудачу при вызове Membership.ValidateUser.Я использую одно и то же имя пользователя / логин для каждого потока в моем тестере нагрузки.Вот ошибка:

  [MySqlException (0x80004005): Deadlock found when trying to get lock; try restarting transaction]
  MySql.Data.MySqlClient.MySqlStream.ReadPacket() +506
  MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32& insertedId) +450
  MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force) +131
  MySql.Data.MySqlClient.MySqlDataReader.NextResult() +1216
  MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) +2191
  MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() +27
  MySql.Web.Security.MySQLMembershipProvider.ValidateUser(String username, String password) +1092

  [ProviderException: An exception occurred. Please check the Event Log.]
  MySql.Web.Security.MySQLMembershipProvider.ValidateUser(String username, String password) +1481
  MyApplication.UserAuthenticator.UserNameAuthenticator.OnAuthenticateRequest(Object source, EventArgs eventArgs) in C:\Develop\MyProject\MyProject.UserAuthenticator\UserNameAuthenticator.cs:123
  System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
  System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)      +270

Есть идеи?

Спасибо, AFrieze

1 Ответ

0 голосов
/ 04 марта 2012

Проверяющий пользователь блокирует строку, чтобы увеличить число попыток ввода неверного пароля, если пароль окажется неверным:

Если в метод ValidateUser введен неверный пароль, внутренний счетчиккоторый отслеживает попытки ввода неверного пароля, увеличивается на единицу.Это может привести к тому, что пользователь будет заблокирован и не сможет войти в систему до тех пор, пока состояние блокировки не будет сброшено вызовом метода UnlockUser.Если указан правильный пароль и пользователь не заблокирован, внутренние счетчики, которые отслеживают неверный пароль и попытки ответа на пароль, обнуляются.Для получения дополнительной информации см. Свойства MaxInvalidPasswordAttempts и PasswordAttemptWindow.

http://msdn.microsoft.com/en-us/library/system.web.security.sqlmembershipprovider.validateuser.aspx

Поскольку вы используете одного и того же пользователя для всех запросов, вы можете получить тупик.

...