我想验证用于在asp.net(.net 3.5)中创建/更新用户的密码字段。密码将用于MembershipProvider
。
实现此目的的最佳方法是什么,以便验证将使用成员资格提供程序的配置设置?当然我可以编写代码,但这似乎是一个非常重要的东西,必须有一个简单的方法来做它。
[edit]澄清这是新用户或更改密码的密码字段,因此ValidateUser
无效。
答案 0 :(得分:2)
我会说答案是否定的,基于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" }));
}
答案 1 :(得分: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(...);
}
答案 2 :(得分: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>
我应该清楚,除了之外还要做任何事情。“验证数据源中是否存在指定的用户名和密码。”您需要自己的提供商。
老实说,我不明白你不想使用自己的提供商的原因....