Principales respuestas
Usando membershipProvider

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.
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.
- Propuesto como respuesta Laura CeglzModerator lunes, 8 de agosto de 2016 17:18
- Marcado como respuesta Laura CeglzModerator jueves, 11 de agosto de 2016 20:40
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.
- Propuesto como respuesta Laura CeglzModerator lunes, 8 de agosto de 2016 17:18
- Marcado como respuesta Laura CeglzModerator jueves, 11 de agosto de 2016 20:40
-