Проверка пароля для MembershipProvider? - PullRequest
5 голосов
/ 23 ноября 2010

Я хотел бы проверить поле пароля для создания / обновления пользователей в asp.net (.net 3.5). Пароль будет использоваться для MembershipProvider.

Каков наилучший способ реализовать это, чтобы при проверке использовались параметры конфигурации поставщика членства? Конечно, я могу просто написать код, но это кажется чем-то настолько фундаментальным, что для этого должен быть способ.

[править] пояснил, что это поле пароля для новых пользователей или для смены паролей, поэтому ValidateUser не помогает.

Ответы [ 3 ]

2 голосов
/ 23 ноября 2010

Я бы сказал, что ответ «нет», основываясь на том факте, что 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" }));
}
0 голосов
/ 23 ноября 2010

Что именно вы подразумеваете под подтверждением?

Существует способ требовать, чтобы пароль был определенной длины, и сделать его сложным (то есть 6 буквенно-цифровым, 6 неалфавитно-цифровым), но у меня нет доступа к моим заметкам по этому вопросу.

Все это будет сделано в файле конфигурации для самого приложения. Я должен согласиться с тем, что вам нужно использовать свою собственную функцию, нет причин не делать этого, поскольку я предполагаю, что вы хотите расширить поведение по умолчанию.

Я сделал быстрый поиск в Google, нашел то, о чем думал, хотя мои заметки более глубоки.

<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 голосов
/ 23 ноября 2010

Сверните собственного провайдера, унаследованного от встроенного:

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(...);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...