Google 密码强度 API






4.45/5 (16投票s)
一个用于 Google 密码强度 API 的 ASP.NET 控件。

引言
您有 iGoogle 帐户吗?如果您像世界其他使用互联网的人一样,您肯定有,这也意味着您已经见过非常酷(而且有用)的“密码强度”控件。
此控件拥有一个非常智能的 API 来确定您输入的密码是否足够安全。之所以说是“智能”,因为它不仅仅检查密码长度是否大于六个字符;例如,密码“aaaaaaaaaaaa”会被评为“弱”、“my password”为“好”,而“grty3657DF?£hr4”则为(您猜对了!)“强”。
最大的秘密是,这实际上是 Google 的一个公共 API,您可以将密码传递给它,它会返回密码强度等级,从 1(最不安全)到 4(最安全)。您可以在这里查看。
但是,该控件没有界面,而且 Google 没有公开宣传它。
背景
当我在当前正在构建的网站上发现对这种控件的需求时,我首先查看了Microsoft AJAX Toolkit。起初,这效果很好;但是,我觉得使用的算法不如 Google 的算法强大,而且我一直收到该控件的 JavaScript 错误。
于是有了这个控件。
使用代码
最简单的方法是添加对GooglePasswordStrength.dll的引用,然后在web.config中添加一个部分。
<pages> 
    <controls> 
        <add tagPrefix="google" namespace="GooglePasswordStrength" 
             assembly="GooglePasswordStrength"/> 
    </controls> 
</pages>
然后,将控件添加到您的页面,并将其附加到一个asp:TextBox。
<table> 
    <tr> 
        <td><asp:TextBox ID="txtPassword" runat="server" /></td>
        <td><google:PasswordStrength ID="PS" 
                TargetControlID="txtPassword" 
                CssClass="password" runat="server" /></td>
    </tr> 
</table>
关注点
该控件利用 AJAX,但不依赖任何第三方 AJAX 库。但是,如果您的应用程序使用Microsoft AJAX 库,则该控件会调用 Rick Strahl 编写的客户端脚本代理来处理所有客户端脚本。
已知问题
XMLHttpRequest直接调用 Google 密码强度 API,因此某些浏览器设置可能会导致“权限被拒绝”错误。这是因为XMLHttpRequest正在调用本地域之外的页面。在 Microsoft Internet Explorer 中,您可以在安全自定义级别设置下更改此设置。查找“杂项 -> 跨域访问数据源”。
要获得更强大、更永久的解决方案,您需要将调用更改为同一域上的页面,并从那里对 Google API 进行WebRequest调用。
更新
- 在GooglePasswordStrength.Web项目中,创建一个名为GetPassword.aspx的新 Web 窗体。
- 在GetPassword.aspx中,删除所有行,只保留@Page指令行。
- 打开GetPassword.aspx.cs。
- 在Page_Load方法中,添加以下代码
- 打开PasswordStrength.js。
- 在第 76 行,有xmlHttpObj.open方法。将"https://www.google.com/accounts/RatePassword?Passwd="替换为"GetPassword.aspx?Passwd="。
- 此外,在PasswordStrength.js文件中,将所有"innerText"实例替换为"innerHTML"(我后来发现innerText仅适用于 IE)。
string passwd = Request.QueryString["Passwd"];
string GUrl = string.Format("https://www.google.com/" + 
              "accounts/RatePassword?Passwd={0}", passwd);
WebRequest webRequest = WebRequest.Create(GUrl);
WebResponse webResponse = webRequest.GetResponse();
StreamReader reader = new StreamReader(webResponse.GetResponseStream());
Response.Clear();
Response.Output.Write(reader.ReadToEnd());
Response.End();
现在,XmlHttpRequestObject将调用同一域上的文件,您将不再收到安全错误。
历史
- 2007 年 11 月 - 添加了第二个演示,它使用了上面更新的代码。


