【问题标题】:Password validator for MembershipProvider?MembershipProvider 的密码验证器?
【发布时间】:2010-11-23 11:39:43
【问题描述】:

我想验证用于在 asp.net (.net 3.5) 中创建/更新用户的密码字段。密码将用于MembershipProvider

实现这一点的最佳方法是什么,以便验证将使用成员资格提供程序的配置设置?当然,我可以只写代码,但这似乎太基础了,必须有一种简单的方法来做。

[edit] 澄清这是新用户或更改密码的密码字段,因此ValidateUser 没有帮助。

【问题讨论】:

    标签: c# asp.net validation membership-provider


    【解决方案1】:

    我会说答案是否定的,因为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" }));
    }
    

    【讨论】:

      【解决方案2】:

      滚动你自己的提供者,继承自内置的:

      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:用我的方式你可以同时检查新老用户。查看我更新的帖子
      【解决方案3】:

      验证到底是什么意思?

      有一种方法可以要求密码具有一定的长度,并使其变得复杂(即 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 默认提供程序将在创建用户之前验证密码是否符合这些规则。如果你想扩展这些规则,唯一的方法就是使用你自己的提供者。
      • 我觉得我没有很好地解释我的问题:/ 我只是在谈论创建新用户或更改现有用户密码的输入验证。这是用于管理用户的管理页面;它与登录无关。我正在使用已经完美配置的SqlMembershipProvider,但我想在尝试创建新用户之前向用户显示验证错误。希望这有助于澄清。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 2015-12-11
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多