代码之家  ›  专栏  ›  技术社区  ›  tenfour

MembershipProvider的密码验证器?

  •  5
  • tenfour  · 技术社区  · 14 年前

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

    实现此功能以便验证使用成员资格提供程序的配置设置的最佳方法是什么?当然我可以直接写代码,但这看起来是非常基本的事情,必须有一个下降的方式来做到这一点。

    [编辑]澄清这是新用户或更改密码的密码字段,因此 ValidateUser 没用。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Jeff Ogata    14 年前

    我认为答案是否定的,因为 SqlMembershipProvider 在其中不调用密码验证方法 ChangePassword CreateUser 方法。使用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
  •  0
  •   abatishchev Karl Johan    14 年前

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

    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(...);
        }
    
        3
  •  0
  •   Security Hound    14 年前

    你所说的验证到底是什么意思?

    有一种方法要求密码有一定的长度,并使其复杂(即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>
    

    如果你想做其他事我应该说清楚 “验证指定的用户名和密码存在于数据源中。” 你需要你自己的提供者。

    我真的不明白你为什么不想用你自己的供应商。。。。

    推荐文章