我想验证ASP.NET (.NET 3.5)中创建/更新用户的密码字段。该密码将用于MembershipProvider。最佳实现方法是什么,以便验证将使用成员资格提供程序的配置设置?当然,我可以编写代码,但这似乎是如此基础的内容,肯定有一种即插即用的方法来完成。[编辑]澄清了这是新用户或更改密码的密码字段,因此ValidateUser无法帮助。
根据事实,我认为答案是否定的。因为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" }));
}
创建你自己的提供程序,继承内置的提供程序:
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(...);
}
你所说的验证具体是什么意思?
有一种方法可以要求密码具有特定的长度,并使其复杂(即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>
如果你想要做除了"验证指定的用户名和密码是否存在于数据源中"之外的任何事情,你需要自己的提供程序。
老实说,我不明白你为什么不想使用自己的提供程序...
SqlMembershipProvider
,但我希望在尝试创建新用户之前向用户呈现验证错误。希望这有助于澄清。 - tenfour
MembershipProvider
的属性验证密码。但我希望有一种内置的方法。我更新了我的问题以澄清这是针对新用户/更新用户的,所以ValidateUser()
没有帮助。 - tenfour