【问题标题】:A sensible PasswordStrengthRegularExpression一个合理的密码强度正则表达式
【发布时间】:2025-12-03 05:20:03
【问题描述】:

我们正在使用标准的 ASP.NET 身份验证提供程序(AspNetSqlMembershipProvider),而默认的密码强度要求对于我们的需求来说有点过分了。

我们要求我们的用户输入至少包含字母数字的密码(即,如果用户愿意,可以输入字母和至少一个数字,混合大小写和非字母数字字符)。

谁能建议什么 PasswordStrengthRegularExpression 设置可以实现这一点?

另外,如果用户尝试使用的密码未通过正则表达式检查,我们如何控制向用户显示的错误消息?

注意

发现minRequiredNonalphanumericCharacters属性必须设置为0,否则这个设置会覆盖任何使用的正则表达式

【问题讨论】:

    标签: asp.net authentication passwords


    【解决方案1】:

    我们刚刚实现了以下表达式来验证 8 到 16 个字符的密码,并包含以下 4 项中的 3 项:大写字母、小写字母、符号、数字

    (?=^[^\s]{8,16}$)((?=.*?\d)(?=.*?[A-Z])(?=.*?[a-z])|(?=.*?\d)(?=.*?[^\w\d\s])(?=.*?[a-z])|(?=.*?[^\w\d\s])(?=.*?[A-Z])(?=.*?[a-z])|(?=.*?\d)(?=.*?[A-Z])(?=.*?[^\w\d\s]))^.*
    

    单个组件的解释:

    • (?=^[^\s]{8,16}$) - 包含 8 到 16 个非空白字符
    • (?=.*?\d) - 包含 1 个数字
    • (?=.*?[A-Z]) - 包含 1 个大写字符
    • (?=.*?[a-z]) - 包含 1 个小写字符
    • (?=.*?[^\w\d\s]) - 包含 1 个符号

    注意,在长度段之后是双括号,稍后在表达式中你会看到几个 |。这允许对允许的 4 种可能的组合进行非此即彼的比较。

    写完这篇文章后,我才注意到一年多前有人问过这个问题。由于我在搜索中遇到了这个问题,我希望其他人也可以从我们的解决方案中受益。

    【讨论】:

    • 谢谢。我知道这是一个老问题,但这真的帮助了我!
    • 感谢正则表达式!它为我节省了开发和测试的时间:)。
    【解决方案2】:

    这是一个允许所有字符且需要至少一个数字且至少需要 6 个字符的正则表达式。

    ^.*(?=.{6,})(?=.*\d).*$
    

    如果您想要定义更多或更少的字符,只需更改 (?=.{6,}) 以反映您想要的最少字符数。

    【讨论】:

    • 为什么是“^.*(?=.{6,})”? “^(?=.{6,})” 是否足以强制执行长度要求?
    • 使用 "^(?=.{6,}$)(?=.*\d).*$",您甚至可以定义最大长度。
    • 我没有看到任何会使 123456 无效的要求。