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 月 - 添加了第二个演示,它使用了上面更新的代码。