【发布时间】:2022-01-24 01:38:19
【问题描述】:
我正在开发一个使用自定义 MembershipProvider 的旧版 ASP.NET 网站项目。我想利用它提供的现有功能来实现密码验证。我想确保所有未来的密码都具有一定的长度,并且包含一定数量的大写、小写和非字母数字字符。
到目前为止,我所做的是根据文档中的示例here 在网站默认页面的 page_load 函数中注册一个 MembershipValidatePasswordEventHandler。我目前将事件处理程序设置为拒绝所有内容作为概念证明,并且它可以工作。尽管如此,考虑到站点中有多个页面,并且默认页面与密码创建/管理没有任何关系,注册事件处理程序似乎是一个奇怪的地方。
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Membership.ValidatingPassword += new MembershipValidatePasswordEventHandler(ValidatePasswordEventHandler);
}
...
public void ValidatePasswordEventHandler(object sender, ValidatePasswordEventArgs e)
{
e.Cancel = true;
}
}
我已经考虑在用户创建或更新页面中注册处理程序,但这似乎仍然不合适。我想知道在我开始执行实际密码检查之前是否有更合适的地方来执行此操作,或者这是执行此操作的标准位置?
对于更广泛问题的其他上下文,我还尝试根据 this 先前的答案修改 web.config 文件中的成员资格提供程序以获取此功能的一部分,但是当我提供无效密码时(小于 7个字符)它不会被拒绝。
<membership defaultProvider="MyMembershipProvider" userIsOnlineTimeWindow="15">
<providers>
<add name="MyMembershipProvider" type="MyNamespace.Membership.MyMembershipProvider" applicationName="MyApp" connectionStringName="MyConnectionString" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="true" writeExceptionsToEventLog="false" passwordFormat="Clear" maxInvalidPasswordAttempts="15" passwordAttemptWindow="10" minRequiredPasswordLength="7"/>
</providers>
</membership>
更新: This 问题还可以为我为什么对 is 事件处理程序感兴趣提供一些额外的理由。最佳答案链接到this 问题。这个问题的最佳答案提到做我在这里所做的事情,但说它可能会“在更高的范围内”完成,这更能解决我的问题。在网站项目的上下文中,更高/最高范围是什么?
解决方案: 我最终使用以下正则表达式修改了我的 ChangePassword Web 控件的 NewPasswordRegularExpression 字段:^(?=.[az])(?=.[AZ])(?=. \d)(?=.[^\da-zA-Z]).{8,}$,而不是实现自定义事件处理程序。
【问题讨论】:
标签: c# asp.net visual-studio membership-provider asp.net-4.5