ASP.NET メンバーシップのパスワードが構成された複雑さの要件を満たしているかどうかをテストするにはどうすればよいでしょうか?
-
22-08-2019 - |
質問
管理者がユーザーのパスワードを変更できる ASP.NET ページがあります。管理者はユーザーのパスワードを知らないため、次のパスワードを使用しています。
MembershipUser member = Membership.GetUser(_usernameTextBox.Text);
member.ChangePassword(member.ResetPassword(), _passNewTextBox.Text);
-- これで説明されているように それで質問.
新しいパスワードが web.config ファイルで構成されている複雑さの要件を満たしていない場合、パスワードはリセットされますが、目的のパスワードには変更されません。新しいパスワードが複雑さの要件を満たしていない場合は、パスワードをまったく変更しないでください。
新しいパスワードを複雑さの要件に照らしてテストする簡単な方法はありますか?
解決
次のプロパティを使用して、パスワードをテストできます。
- Membership.PasswordStrength RegularExpression
- Membership.MinRequiredPasswordLength
- Membership.MinRequired非英数字文字
web.config ファイルで設定していない場合、PasswordStrength RegularExpression プロパティは空の文字列になることに注意してください。
正規表現のマッチングについては、MSDN リファレンスを参照してください。 Regex.IsMatch(文字列)
*Matt さん、有益なコメントをありがとう。
他のヒント
/// <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行が、小さなバグを修正するために調整する必要があります。
変更
もし(nonAlnumCount
番場のソリューションに基づいて、私は、メンバシッププロバイダに拡張メソッドを作ることにした(そしてコードを縮小ます:
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(...)
を呼び出す必要があります。
パスワードが複雑さの要件を満たしているかどうかを確認するために正規表現のバリデータを使用することができます。
また、あなたは Pasword強度計のコントロールを使用することができますます。
これは、最も簡単な方法でもよいが、ページ上の正規表現のバリデータを使用して、パスワードの要件と一致しないことがあります。パスワードが良好でない場合はその方法は、あなたも戻って投稿する必要はありません。