如何测试ASP.NET会员密码是否符合配置的复杂性要求?

20

我有一个ASP.NET页面,允许管理员为用户更改密码。由于管理员不知道用户的密码,因此我使用以下方法:

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

根据这个SO问题所述:

如果新密码不符合在web.config文件中配置的复杂度要求,则密码将被重置,但并未更改为所需的密码。如果新密码不符合复杂度要求,则密码根本不应更改。

有没有一种简单的方法来测试新密码是否符合复杂度要求?

6个回答

19
/// <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;
}

2
为什么不将其作为“MembershipProvider”扩展方法,并像“Membership.CheckPasswordComplexity(...)”一样使用它呢? - PhilDulac
@PhilDulac,因为Membership指的是不同类型的System.Web.Security.Membership,这是一个静态类,无法添加扩展方法。 - benmccallum
@benmccallum 我打错字了,我本来是想给 MembershipProvider 添加一个扩展方法的。使用方式应该是 Membership.Provider.CheckPasswordComplexity(...) - PhilDulac

18
您可以使用以下属性来测试密码: 请注意,如果您未在web.config文件中进行配置,则PasswordStrengthRegularExpression属性将为空字符串。
有关正则表达式匹配的信息,请参阅MSDN上的Regex.IsMatch(String)参考文献。
*感谢Matt提供的有用评论。

如果在web.config中没有配置Membership.PasswordStrengthRegularExpression,则它看起来是“”。 MinRequiredPasswordLength和MinRequiredNonAlphanumericCharacters仍然可以配置。 - Matt Brunell

3

我无法访问维基百科。

需要调整一行代码来修复一个小错误。

修改 if (nonAlnumCount < Membership.MinRequiredNonAlphanumericCharacters) 如下 if (nonAlnumCount < membershipProvider.MinRequiredNonAlphanumericCharacters)


3

基于Bamba的解决方案,我决定在会员提供程序上编写一个扩展方法(并简化了代码):

    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
    }

要使用它,您只需在需要的地方调用Membership.Provider.IsPasswordValid(...)即可。

0

您可以使用正则表达式验证器来检查密码是否符合复杂性要求。

此外,您还可以使用密码强度计控件。


0

这可能不是最简单的方法,但可以在页面上使用正则表达式验证器并使其符合密码要求。 这样,即使密码不好,您也无需回传。


如果您决定使用这种方法,请确保从提供者的服务器端获取密码复杂性正则表达式,这样您就不必在两个不同的位置定义它。唯一的问题是,您将无法仅使用一个验证器验证成员资格提供程序定义的所有内容。 - PhilDulac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接