2008-12-17 7 views
19

Tengo una página ASP.NET que permite a un administrador cambiar la contraseña de un usuario. Desde el administrador no conoce la contraseña del usuario, estoy usando la siguiente:¿Cómo se puede probar si una contraseña de membresía de ASP.NET cumplirá con los requisitos de complejidad configurados?

MembershipUser member = Membership.GetUser(_usernameTextBox.Text); 
member.ChangePassword(member.ResetPassword(), _passNewTextBox.Text); 

- tal como se describe por esta SO question.

Si la nueva contraseña no cumple con los requisitos de complejidad que se configuran en el archivo web.config, la contraseña se habrá restablecido, pero no se habrá cambiado a la deseada. Si la nueva contraseña no cumple con los requisitos de complejidad, la contraseña no debe cambiar en absoluto.

¿Existe alguna manera fácil de probar la nueva contraseña contra los requisitos de complejidad?

Respuesta

17

Puede utilizar las siguientes propiedades para probar la contraseña en contra:

Tenga en cuenta que la propiedad PasswordStrengthRegularExpression será una cadena vacía si tiene no configurado en el archivo web.config.

Para información sobre expresiones regulares, consulte la referencia de MSDN en Regex.IsMatch(String)

* Gracias a Matt por los comentarios útiles.

+0

Parece que Membership.PasswordStrengthRegularExpression es "" si no está configurado en web.config. MinRequiredPasswordLength y MinRequiredNonAlphanumericCharacters aún pueden configurarse. –

0

Puede usar un Validador de expresiones regulares para verificar si la contraseña cumple con los requisitos de complejidad.

También puede usar un control Pasword Strength Meter.

0

Puede que no sea la forma más fácil, pero use un validador de expresiones regulares en la página y haga que coincida con los requisitos de contraseña. De esta forma, ni siquiera tendrá que volver a publicar si la contraseña no es buena.

+0

Si decide utilizar este enfoque, asegúrese de obtener la complejidad de contraseña RegEx en el lado del servidor del proveedor para que no tenga que definirla en 2 lugares diferentes. Lo único es que no podrá validar todo lo que el proveedor de membresía define con solo un validador. – PhilDulac

18
/// <summary> 
/// Checks password complexity requirements for the actual membership provider 
/// </summary> 
/// <param name="password">password to check</param> 
/// <returns>true if the password meets the req. complexity</returns> 
static public bool CheckPasswordComplexity(string password) 
{ 
    return CheckPasswordComplexity(Membership.Provider, password); 
} 


/// <summary> 
/// Checks password complexity requirements for the given membership provider 
/// </summary> 
/// <param name="membershipProvider">membership provider</param> 
/// <param name="password">password to check</param> 
/// <returns>true if the password meets the req. complexity</returns> 
static public bool CheckPasswordComplexity(MembershipProvider membershipProvider, string password) 
{ 
    if (string.IsNullOrEmpty(password)) return false; 
    if (password.Length < membershipProvider.MinRequiredPasswordLength) return false; 
    int nonAlnumCount = 0; 
    for (int i = 0; i < password.Length; i++) 
    { 
     if (!char.IsLetterOrDigit(password, i)) nonAlnumCount++; 
    } 
    if (nonAlnumCount < membershipProvider.MinRequiredNonAlphanumericCharacters) return false; 
    if (!string.IsNullOrEmpty(membershipProvider.PasswordStrengthRegularExpression) && 
     !Regex.IsMatch(password, membershipProvider.PasswordStrengthRegularExpression)) 
    { 
     return false; 
    } 
    return true; 
} 
+1

¿Por qué no hacerlo un método de extensión 'MembershipProvider' y usarlo como' Membership.CheckPasswordComplexity (...) '? – PhilDulac

+0

@PhilDulac, porque 'Membresía' se refiere a un tipo diferente de' System.Web.Security.Membership', una clase estática a la que no puede agregar métodos de extensión. – benmccallum

+0

@benmccallum Hice un error tipográfico, quise agregar un método de extensión a 'MembershipProvider'. el uso habría sido 'Membership.Provider.CheckPasswordComplexity (...)' – PhilDulac

3

No tengo acceso a la wiki.

Una línea se debe ajustar para corregir un pequeño error.

modificar si (nonAlnumCount < Membership.MinRequiredNonAlphanumericCharacters) de la siguiente manera si (nonAlnumCount < membershipProvider.MinRequiredNonAlphanumericCharacters)

+0

He actualizado la wiki en consecuencia. Buena atrapada. –

3

Sobre la base de la solución de Bamba, decidí hacer un método de extensión en el proveedor de pertenencia (y la reducción de la código:

public static bool IsPasswordValid(this MembershipProvider membershipProvider, string password) 
    { 
     return (!string.IsNullOrEmpty(password) && // Password is not empty or null AND 
      password.Length >= membershipProvider.MinRequiredPasswordLength && // Meets required length AND 
      password.Count(c => !char.IsLetterOrDigit(c)) >= membershipProvider.MinRequiredNonAlphanumericCharacters && // Contains enough non-alphanumeric characters AND 
      (string.IsNullOrEmpty(membershipProvider.PasswordStrengthRegularExpression) || // Either there is no RegEx requirement OR 
       Regex.IsMatch(password, membershipProvider.PasswordStrengthRegularExpression))); // It matches the RegEx 
    } 

para usarlo, sólo tiene que llamar Membership.Provider.IsPasswordValid(...) siempre que sea necesario

.
Cuestiones relacionadas