65.9K
CodeProject 正在变化。 阅读更多。
Home

密码强度指示器 NuGet 包

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (11投票s)

2016年12月28日

CPOL

10分钟阅读

viewsIcon

29745

downloadIcon

160

使用 jQuery 和 XML + NuGet 包的密码强度指示器。

Password Strength indicator

目录

引言

最近,我得到了机会评审 ASP.NET - Password Strength Indicator using jQuery and XML 插件并对其进行了一些改进。以下是更改的摘要。

如前一篇文章所述,该插件的目的是为用户选择强密码提供指导。我想重申一下,该插件在客户端和服务器端提供以下验证:

  • 检查密码是否包含指定数量的必需大写字符(A-Z)
  • 检查密码是否包含任何小写字符(a-z)
  • 检查密码是否包含指定数量的必需十进制数字(0-9)
  • 检查密码是否包含指定数量的必需允许的非字母数字字符(特殊字符,如:! @ # ...)
  • 检查密码是否满足最小和最大密码长度要求
  • 检查密码是否超过了允许的最大连续重复字符数
  • 检查密码是否包含 XML 文件中指定的键盘字符序列

如果希望添加以下功能,您需要编写额外的代码/逻辑

  • 阻止用户使用前 x 次历史密码
  • 密码最大有效期
  • 阻止用户输入常见字符(例如,Apple、Chicken 等)(我认为您可以将其包含在 keyboardSequenceCharacters 节点下,但这会过于庞大)
  • 等等。

在本文中,请允许我与大家分享以下内容:

  1. 评审 PasswordPolicy.xml 中的元素
  2. 评审检查键盘/字符序列的逻辑
  3. 如何创建和发布 NuGet 包
  4. 如何使用该包

PasswordPolicy.xml 文件包含什么?

表 1 显示了 XML 节点列表及其对应的描述

节点 描述
duration 这只是一个示例。您可以向 XML 文件添加节点和值,然后将业务逻辑添加到 PasswordStrengthIndicator.Core 类中
minLength 密码可接受的最小长度
maxLength 密码可接受的最大长度
numsLength 必需数字(0-9)的最小数量
upperLength 必需大写字母(A-Z)的最小数量
specialLength 必需特殊字符的最小数量
barWidth 指定条形指示器的宽度 [示例:100, 200]
barColor 指定条形的最终颜色 [示例:黄色、栗色等]
specialChars 允许的有效特殊字符
useMultipleColors 开启/关闭多种颜色 [红色、蓝色、绿色]。1=是,0=否
maxConsecutiveRepeatedChars 0 = 允许重复,无验证。[示例:aaaaaaaaA 将是有效的]
1 及以上 = 指定给定字符连续重复的最大数量。示例
  • 如果为 1,则 aa 将无效,因为它重复超过 1 次
  • 如果为 2,则 aaa 将无效,因为它重复超过 2 次
maxKeyboardSequence 指定最大允许的键盘/字符序列。示例
  • 如果为 2,则 123 无效,但 12 有效。
  • 如果为 3,则 qwer159 无效,但 qwe159 有效
注意:序列在 keyboardSequenceCharacters 节点中定义)。
keyboardSequenceCharacters 指定键盘/字符序列。根据您使用的键盘类型,节点名称可能有点误导。您可以在这里发挥创意,在一个 string 中指定任何您认为构成序列的内容。示例:abcdefghijklmnopqrstuvwxyzzyxwvuts...123456...
注意:不区分大小写
表 1

检查键盘/字符序列的逻辑

列表 1 和 2 分别显示了服务器端和客户端验证代码。首先,代码将从 PasswordPolicy.xml 文件中检索最大字符序列(MaxKeyboardSequence)和序列字符(KeyboardSequenceCharacters)。然后,它将遍历用户输入的密码字符串,以查找 string 的任何部分是否是 KeyboardSequenceCharacters 中定义的 string 的子集。

这里有一个例子。假设用户输入 Nin@Abc357MaxKeyboardSequenceKeyboardSequenceCharacters 分别设置为 2 和 abcdefghijklmnopqrstuvwxyzzyxwvuts。最初,逻辑将检查 KeyboardSequenceCharacters 是否包含 Nin。然后,它将检查是否包含 in@n@A@AbAbc 等。如果 KeyboardSequenceCharacters 设置为 3,则验证检查将从 Nin@in@An@Ab 等开始。根据示例,输入的密码的一部分(Nin@Abc357)是 KeyboardSequenceCharacters 的子集。因此,用户将在客户端收到类似“不允许使用键盘序列字符…”的验证错误。如前所述,请随时在 KeyboardSequenceCharacters 值下输入任何您认为构成序列的字符串。

 public static bool IsPasswordContainSequence
        (string strPassword, PasswordSetting passwordSetting)
        {
            int startIndex = 0;
            int num = 0;
            int length = passwordSetting.MaxKeyboardSequence + 1;
            string empty = string.Empty;
            string str1 = passwordSetting.KeyboardSequenceCharacters;
            while (num < strPassword.Length)
            {
                num = startIndex + length;
                string str2 = strPassword.ToLower().Substring(startIndex, length);
                if (str1.Contains(str2))
                    return true;
                ++startIndex;
            }
            return false;
        }
列表 1
    this.getKeyboardSequenceChar = function (passwordVal) {
            var maxQwertySequence = password_settings.maxKeyboardSequence + 1;
            var keyboardSequenceCharacters = 
                password_settings.keyboardSequenceCharacters;
            var num = 0;
            var startIndex = 0;
            if (passwordVal.length >= maxQwertySequence) {
                while (num < passwordVal.length) {
                    num = startIndex + maxQwertySequence;
                    var lastXsubString = 
                        passwordVal.substr(startIndex, maxQwertySequence);
                    if (keyboardSequenceCharacters.indexOf
                                (lastXsubString.toLowerCase()) >= 0) {
                        return lastXsubString;
                    }
                    startIndex++;
                }
            }
列表 2

如何创建 NuGet 包?

第一步是从 http://nuproj.net/ 下载并安装 NuGet Package Project 扩展。
安装后,打开 Visual Studio IDE,导航到 **文件**、**新建**、**项目**,然后在已安装的模板中选择 **NuGet**。请参阅图 1。

new nuget project

图 2

在项目中添加两个文件夹,分别为 Contentlib。我们可以通过右键单击项目,选择 **添加**,然后选择 **新建文件夹** 来做到这一点。我将把 JavaScript、XML 文件和示例页面添加到 Content 文件夹中。Content 文件夹中的文件将在安装过程中添加到目标解决方案中。现在,我希望 PasswordStrengthIndicator.Core.dll 在安装过程中添加到目标引用中。为了做到这一点,我将把 PasswordStrengthIndicator.Core.dll 程序集添加到 lib 文件夹中。接下来,我将 web.config.install.xdtweb.config.uninstall.xdt 添加到 Content 文件夹中。这两个文件的目的是在包安装和卸载期间向 web.config appSettings 部分添加和删除一个键。此时,解决方案应该看起来像图 3。

nuget project with files and folder

图 3

web.config.install.xdt 和 web.config.uninstall.xdt 文件包含什么?

列表 3 和列表 4 分别显示了 web.config.install.xdtweb.config.uninstall.xdt 的内容。在包安装期间,NuGet 将检查 appSettings 元素是否存在,如果不存在,则插入该元素。然后,它将检查是否需要将 passwordPolicyXMLLocation 键插入到 web.config 文件中。为了避免复杂化,将在包卸载期间从 web.config 中删除 passwordPolicyXMLLocation 键,而不是整个 appSettings 元素。

<?xml version="1.0" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
   <appSettings xdt:Transform="InsertIfMissing">
   <add key="passwordPolicyXMLLocation" value="~/MyXML/PasswordPolicy.xml" 
        xdt:Locator="Match(key)" xdt:Transform="InsertIfMissing" />
   </appSettings>
</configuration>
列表 3
<?xml version="1.0" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <appSettings>
    <add key="passwordPolicyXMLLocation" 
     xdt:Transform="Remove" xdt:Locator="Match(key)" />
    </appSettings>
</configuration>
列表 4

包设置

右键单击项目并选择属性来更新包属性。在这里,您可以指定包 ID、包版本、项目 URL,提供包的摘要和描述、许可证 URL 等。包名称是包 ID 和包版本的组合。在此示例中,包名称将以 NuGetPackage1.1.0.0.nupkg 结尾。因此,每次更新包时,请不要忘记更新包版本。nuget.org 不允许您发布两次相同名称的包。您还可以使用 Readme.txt 文件包含有关包的更多信息。

nuget package properties

图 4

如何测试包然后发布?

让我们开始打开一个当前的 Web 项目或创建一个新的 Web 项目。转到 **工具**、**NuGet 包管理器**、**包管理器设置**。单击 **包源**,添加(绿色加号),然后单击省略号(…)浏览到包位置。之后,单击 **更新** 按钮。有关示例,请参阅图 5。

nuget package source

图 5

现在,我们回到 **工具**、**NuGet 包管理器**、**管理解决方案的 NuGet 包**。将包源更改为图 5 中指定的名称,然后单击 **浏览**。选择包和项目,然后单击 **安装** 按钮。有关示例,请参阅图 6。

nuget package test local

图 6

如何发布包?

一旦我们验证了包已成功安装/卸载,请导航到 https://nuget.net.cn,登录,如果您还没有帐户,请创建一个。单击 **上传包** 菜单项。然后单击浏览并导航到包位置。在本例中,包名称为 NuGetPackage1.1.0.0.nupkg。按照屏幕上的说明完成此过程。

如何安装 PasswordStrengthIndicator NuGet 包?

从菜单中,单击 工具、**NuGet 包管理器**、**管理解决方案的 NuGet 包**…。确保包源指向 nugget.org。单击 **浏览** 并搜索 PasswordStrengthIndicatorBryian Tan。您应该会看到与图 7 类似的搜索结果。选择要安装此包的项目,然后单击 **安装** 按钮。

nuget package install

图 7

包成功安装后,readme.txt 将打开。您可以阅读它以了解有关插件的更多信息。您的项目解决方案中应包含以下项:

  1. MyXML 文件夹,其中包含 PasswordPolicy.xmlPasswordPolicy.xslt 文件
  2. PasswordStrengthIndicator.Example,其中包含 Default.aspx.txtjQuery_Password_Strength_Indicator.htm 文件
  3. Scripts 文件夹下,您应该会看到 jquery.password-strength-2.0.min.jsjquery.blockUI.js
  4. 项目应引用 PasswordStrengthIndicator.Core
  5. passwordPolicyXMLLocation 键已被添加到 web.configappSettings 部分

要运行测试,请打开 jQuery_Password_Strength_Indicator.htm 文件并更新 jQuery 引用。将 Default.aspx.txt 重命名为 Default.aspx 并更新 jQuery 引用。

如何安装 Password Strength Indicator 而不使用 NugGet 包管理器

以下是将包安装到 ASP.NET 应用程序/项目或其他框架(如 Classic ASP/PHP 等)而不使用 NuGet Manager 的步骤:

  1. 下载并解压缩 NuGet 包
  2. 请注意,此插件需要 jQuery 1.3+
  3. 导航到 Content 文件夹,并将 MyXMLPasswordStrengthIndicator.ExampleScripts 文件夹复制到应用程序解决方案中
  4. 将以下键添加到 web.configappSettings(不适用于其他框架)
    < key="passwordPolicyXMLLocation" value="~/MyXML/PasswordPolicy.xml" />
  5. 将引用 lib/PasswordStrengthIndicator.Core.dll 添加到项目中(不适用于其他框架)
  6. 对于其他应用程序框架,您需要编写自己的服务器端验证,请参阅 PasswordStrengthIndicator.Core 源代码。
  7. 同样,您可以从存储库下载源代码/示例代码并研究项目结构。

结论

我希望有人会发现这些信息有用,并让您的编程工作更轻松。如果您发现任何 bug、不同意内容或想帮助改进本文,请给我写信,我将与您一起进行更正。我建议您下载演示并进行探索,以便掌握完整概念,因为我可能在本文中遗漏了一些重要信息。如果您想帮助改进本文,请与我联系。请使用以下链接报告任何问题:https://github.com/bryiantan/PasswordStrengthIndicator/issues

测试于:Internet Explorer 11,10,9.0, Firefox 50, Google Chrome 25.0 和 Apple Safari 5.1.7

IE, Firefox, Google Chrome, Safari

观看此脚本演示

下载

资源

历史

  • 2016 年 12 月 26 日 - 初始版本
  • 2017 年 1 月 3 日 - 添加了“不使用 NugGet 包管理器安装 Nuget 包”
  • 2017 年 1 月 11 日 - 更新了“不使用 NugGet 包管理器安装 Nuget 包”
  • 2017 年 2 月 20 日 - 更新了内容/语言
© . All rights reserved.