MembershipProvider的密码验证器?

5
我想验证ASP.NET (.NET 3.5)中创建/更新用户的密码字段。该密码将用于MembershipProvider。最佳实现方法是什么,以便验证将使用成员资格提供程序的配置设置?当然,我可以编写代码,但这似乎是如此基础的内容,肯定有一种即插即用的方法来完成。[编辑]澄清了这是新用户或更改密码的密码字段,因此ValidateUser无法帮助。
3个回答

3

根据事实,我认为答案是否定的。因为SqlMembershipProvider在其ChangePasswordCreateUser方法中没有调用密码验证方法。通过使用Reflector,您可以看到它在两种方法中都运行相同的一组检查(如下所示)。因此,我认为像您正在做的那样编写自己的函数是正确的方式。

if (newPassword.Length < this.MinRequiredPasswordLength)
{
    throw new ArgumentException(SR.GetString("Password_too_short", new object[] { "newPassword", this.MinRequiredPasswordLength.ToString(CultureInfo.InvariantCulture) }));
}
int num3 = 0;
for (int i = 0; i < newPassword.Length; i++)
{
    if (!char.IsLetterOrDigit(newPassword, i))
    {
        num3++;
    }
}
if (num3 < this.MinRequiredNonAlphanumericCharacters)
{
    throw new ArgumentException(SR.GetString("Password_need_more_non_alpha_numeric_chars", new object[] { "newPassword", this.MinRequiredNonAlphanumericCharacters.ToString(CultureInfo.InvariantCulture) }));
}
if ((this.PasswordStrengthRegularExpression.Length > 0) && !Regex.IsMatch(newPassword, this.PasswordStrengthRegularExpression))
{
    throw new ArgumentException(SR.GetString("Password_does_not_match_regular_expression", new object[] { "newPassword" }));
}

0

创建你自己的提供程序,继承内置的提供程序:

public class SqlMembershipProvider : System.Web.Security.SqlMembershipProvider
{
    // called on login attempt
    public override bool ValidateUser(string userName, string password)
    {
        // do your logic

        // use built-in properties, parsed by base class for you, such as:
        if (password.Length < this.MinRequiredPasswordLength)
        {
        }

        //if ok, then:
        base.ValidateUser(userName, password);
    }

    // called on new user creation attempt
    public override MembershipUser CreateUser(string userName, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
    {
        // do your logic

        //if ok, then:
        base.CreateUser(...);
    }

我的当前解决方案是编写自己的函数,根据MembershipProvider的属性验证密码。但我希望有一种内置的方法。我更新了我的问题以澄清这是针对新用户/更新用户的,所以ValidateUser()没有帮助。 - tenfour
@tenfour:使用我的方法,您可以检查新用户和旧用户。请查看我的更新帖子。 - abatishchev

0

你所说的验证具体是什么意思?

有一种方法可以要求密码具有特定的长度,并使其复杂(即6个字母数字,6个非字母数字),但我无法访问有关此主题的笔记。

所有这些都将在应用程序本身的配置文件中完成。 我必须同意您需要使用自己的函数,因为我认为您想扩展默认行为,这没有任何理由不这样做。

我进行了快速的谷歌搜索,找到了我所想的内容,尽管我的笔记更加深入。

<membership defaultProvider="SqlProvider"
  userIsOnlineTimeWindow = "20>
  <providers>
    <add
      name="SqlProvider"
      type="System.Web.Security.SqlMembershipProvider"
      connectionStringName="SqlServices"
      requiresQuestionAndAnswer="true"
      minRequiredPasswordLength="7"
      minRequiredNonalphanumericCharacters="1"
      />
  </providers>
</membership>

如果你想要做除了"验证指定的用户名和密码是否存在于数据源中"之外的任何事情,你需要自己的提供程序。

老实说,我不明白你为什么不想使用自己的提供程序...


@tenfour 默认提供程序将在用户创建之前验证密码是否符合这些规则。如果您想扩展这些规则,唯一的方法是使用自己的提供程序。 - Security Hound
我有一种感觉,我没有很好地解释我的问题:/ 我只是在谈论创建新用户或更改现有用户密码的输入验证。这是用于管理用户的管理页面;它与登录无关。我正在使用已经完美配置的SqlMembershipProvider,但我希望在尝试创建新用户之前向用户呈现验证错误。希望这有助于澄清。 - tenfour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接