我有一个ASP.NET页面,允许管理员更改用户的密码。由于管理员不知道用户的密码,我使用以下内容:
MembershipUser member = Membership.GetUser(_usernameTextBox.Text);
member.ChangePassword(member.ResetPassword(), _passNewTextBox.Text);
- 正如此SO question所述。
如果新密码不符合web.config文件中配置的复杂性要求,则密码将被重置,但不会更改为所需的密码。如果新密码不符合复杂性要求,则密码不应发生任何变化。
是否有一种简单的方法可以根据复杂性要求测试新密码?
答案 0 :(得分: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;
}
答案 1 :(得分:18)
您可以使用以下属性来测试密码:
请注意,如果您尚未在web.config文件中配置它,则PasswordStrengthRegularExpression属性将为空字符串。
有关正则表达式匹配的信息,请参阅Regex.IsMatch(String)
上的MSDN参考*感谢Matt的有用评论。
答案 2 :(得分:3)
我无法访问维基。
应该调整一行来修复一个小错误。
修改 if(nonAlnumCount&lt; Membership.MinRequiredNonAlphanumericCharacters) 如下 if(nonAlnumCount&lt; membershipProvider.MinRequiredNonAlphanumericCharacters)
答案 3 :(得分: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(...)
。
答案 4 :(得分:0)
您可以使用正则表达式验证器来检查密码是否符合复杂性要求。
您也可以使用Pasword Strength Meter控件。
答案 5 :(得分:0)
这可能不是最简单的方法,但在页面上使用正则表达式验证器并使其符合密码要求。这样,如果密码不好,你甚至不必回复。