none
Usando membershipProvider RRS feed

  • Pregunta

  •  Hola 

     Resulta que estoy haciendo un proveedor para mongodb ,y para ello herede la clase membershipProvider pero me surge el siguiente problema.

    Estoy usando el driver de mongo con C# y el mismo tiene metodos asicronos y esto rompe con la herencia ,hay alguna forma de solucionarlo 

    ejemplo:

          

      public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
            {
                if (providerUserKey != null && !(providerUserKey is Guid))
                {
                    status = MembershipCreateStatus.InvalidProviderUserKey;
                    return null;
                }
                else
                {
                    providerUserKey = Guid.NewGuid();
                }

                var validatePasswordEventArgs = new ValidatePasswordEventArgs(username, password, true);
                this.OnValidatingPassword(validatePasswordEventArgs);

                if (validatePasswordEventArgs.Cancel)
                {
                    status = MembershipCreateStatus.InvalidPassword;
                    return null;
                }

                if (this.RequiresQuestionAndAnswer && string.IsNullOrWhiteSpace(passwordQuestion))
                {
                    status = MembershipCreateStatus.InvalidQuestion;
                    return null;
                }

                if (this.RequiresQuestionAndAnswer && string.IsNullOrWhiteSpace(passwordAnswer))
                {
                    status = MembershipCreateStatus.InvalidAnswer;
                    return null;
                }

                if (this.GetUser(username, false) != null)
                {
                    status = MembershipCreateStatus.DuplicateUserName;
                    return null;
                }

                if (this.GetUser(providerUserKey, false) != null)
                {
                    status = MembershipCreateStatus.DuplicateProviderUserKey;
                    return null;
                }

                if (this.RequiresUniqueEmail && !string.IsNullOrWhiteSpace(this.GetUserNameByEmail(email)))
                {
                    status = MembershipCreateStatus.DuplicateEmail;
                    return null;
                }

                byte[] buffer = new byte[16];
                (new RNGCryptoServiceProvider()).GetBytes(buffer);
                var salt = Convert.ToBase64String(buffer);

                var creationDate = DateTime.UtcNow;

                var bsonDocument = new BsonDocument
                {
                    { "_id", (Guid)providerUserKey },
                    { "ApplicationName", this.ApplicationName },
                    { "CreationDate", creationDate },
                    { "Email", email },
                    { "FailedPasswordAnswerAttemptCount", 0 },
                    { "FailedPasswordAnswerAttemptWindowStart", creationDate },
                    { "FailedPasswordAttemptCount", 0 },
                    { "FailedPasswordAttemptWindowStart", creationDate },
                    { "IsApproved", isApproved },
                    { "IsLockedOut", false },
                    { "LastActivityDate", creationDate },
                    { "LastLockoutDate", new DateTime(1970, 1, 1) },
                    { "LastLoginDate", creationDate },
                    { "LastPasswordChangedDate", creationDate },
                    { "LoweredEmail", email != null ? email.ToLowerInvariant() : null },
                    { "LoweredUsername", username.ToLowerInvariant() },
                    { "Password", this.EncodePassword(password, this.PasswordFormat, salt) },
                    { "PasswordAnswer", this.EncodePassword(passwordAnswer, this.PasswordFormat, salt) },
                    { "PasswordQuestion", passwordQuestion },
                    { "Salt", salt },
                    { "Username", username }
                };
                this.mongoCollection.InsertOneAsync(bsonDocument).GetAwaiter().GetResult();

                status = MembershipCreateStatus.Success;
                return this.GetUser(username, false);
            }

    como el metodo InsertOneAsync es asincronico  del nuevo driver de mongo ,no puedo hacer lo siguiente ya que rompe con la herencia

    public async Task<MembershipUser> CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
            {
                if (providerUserKey != null && !(providerUserKey is Guid))
                {
                    status = MembershipCreateStatus.InvalidProviderUserKey;
                    return null;
                }
                else
                {
                    providerUserKey = Guid.NewGuid();
                }

                var validatePasswordEventArgs = new ValidatePasswordEventArgs(username, password, true);
                this.OnValidatingPassword(validatePasswordEventArgs);

                if (validatePasswordEventArgs.Cancel)
                {
                    status = MembershipCreateStatus.InvalidPassword;
                    return null;
                }

                if (this.RequiresQuestionAndAnswer && string.IsNullOrWhiteSpace(passwordQuestion))
                {
                    status = MembershipCreateStatus.InvalidQuestion;
                    return null;
                }

                if (this.RequiresQuestionAndAnswer && string.IsNullOrWhiteSpace(passwordAnswer))
                {
                    status = MembershipCreateStatus.InvalidAnswer;
                    return null;
                }

                if (this.GetUser(username, false) != null)
                {
                    status = MembershipCreateStatus.DuplicateUserName;
                    return null;
                }

                if (this.GetUser(providerUserKey, false) != null)
                {
                    status = MembershipCreateStatus.DuplicateProviderUserKey;
                    return null;
                }

                if (this.RequiresUniqueEmail && !string.IsNullOrWhiteSpace(this.GetUserNameByEmail(email)))
                {
                    status = MembershipCreateStatus.DuplicateEmail;
                    return null;
                }

                byte[] buffer = new byte[16];
                (new RNGCryptoServiceProvider()).GetBytes(buffer);
                var salt = Convert.ToBase64String(buffer);

                var creationDate = DateTime.UtcNow;

                var bsonDocument = new BsonDocument
                {
                    { "_id", (Guid)providerUserKey },
                    { "ApplicationName", this.ApplicationName },
                    { "CreationDate", creationDate },
                    { "Email", email },
                    { "FailedPasswordAnswerAttemptCount", 0 },
                    { "FailedPasswordAnswerAttemptWindowStart", creationDate },
                    { "FailedPasswordAttemptCount", 0 },
                    { "FailedPasswordAttemptWindowStart", creationDate },
                    { "IsApproved", isApproved },
                    { "IsLockedOut", false },
                    { "LastActivityDate", creationDate },
                    { "LastLockoutDate", new DateTime(1970, 1, 1) },
                    { "LastLoginDate", creationDate },
                    { "LastPasswordChangedDate", creationDate },
                    { "LoweredEmail", email != null ? email.ToLowerInvariant() : null },
                    { "LoweredUsername", username.ToLowerInvariant() },
                    { "Password", this.EncodePassword(password, this.PasswordFormat, salt) },
                    { "PasswordAnswer", this.EncodePassword(passwordAnswer, this.PasswordFormat, salt) },
                    { "PasswordQuestion", passwordQuestion },
                    { "Salt", salt },
                    { "Username", username }
                };
                await mongoCollection.InsertOneAsync(bsonDocument);
                status = MembershipCreateStatus.Success;
                return this.GetUser(username, false);

            }

    puede haber alguna forma de integrarlo? agradeseria mucho alguna sugerencia

    Saludos.

    lunes, 8 de agosto de 2016 0:45

Respuestas

  • El proveedor original de Membershio no usa metodos asincronos, asi que no puedes simplemente ponerles "async", ya que no sirven para satisfacer la herencia desde la clase madre. En lugar de eso, tendras que hacer las llamadas en modo sincrono. Simplemente, en lugar de obtener resultados con "await", ponles al final .Result para que se espere hasta recibir el resultado del Task.
    lunes, 8 de agosto de 2016 7:50

Todas las respuestas

  • El proveedor original de Membershio no usa metodos asincronos, asi que no puedes simplemente ponerles "async", ya que no sirven para satisfacer la herencia desde la clase madre. En lugar de eso, tendras que hacer las llamadas en modo sincrono. Simplemente, en lugar de obtener resultados con "await", ponles al final .Result para que se espere hasta recibir el resultado del Task.
    lunes, 8 de agosto de 2016 7:50
  • Una cosa podria ser  es agregarle un metodo asincronico como por ejemplo CreateUserAsync con esto la clase hija tendrìa el metodo sincronico CreateUser y el mètodo asinconico CreateUserAsync.

    martes, 9 de agosto de 2016 2:39