2010-11-23 48 views
4

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

什么是最好的方式来实现这个验证将使用成员资格提供者的配置设置?当然,我可以编写代码,但这似乎是一件非常重要的事情,必须有一种方法来做到这一点。

澄清,这是一个新用户或更改密码的密码字段,所以ValidateUser没有帮助。

回答

2

我想说的答案是否定的,基于的事实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(...); 
    } 
+0

我当前的解决方案的确是写我自己的函数,它根据MembershipProvider的属性验证密码。希望有一个内置的方式。我更新了我的问题以澄清这是针对新用户/更新用户的,因此`ValidateUser()`不起作用。 – tenfour 2010-11-23 11:52:33

+0

@tenfour:用我的方式,你可以检查新老用户。看到我更新的帖子 – abatishchev 2010-11-23 11:59:44

0

究竟你的validate是什么意思?

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

,如果你想要做任何超出我应该清楚“验证指定的用户名和密码的数据源存在。”你需要你自己的提供者。

老实说,我不明白你不想使用自己的供应商的原因....

+0

我的意思是输入验证。提供程序已配置。 – tenfour 2010-11-23 12:42:25