Пользовательский ValidateUser() в пользовательском .net MembershipProvider

#c# #asp.net-membership #membership-provider

#c# #asp.net-членство #поставщик членства

Вопрос:

Есть ли способ расширить метод ValidateUser для получения других параметров, отличных от параметров по умолчанию?

По умолчанию

 public override bool ValidateUser(string username, string password)
{
    return db.ValidateUser(username, password);
}
  

Я хотел бы реализовать

 public bool ValidateUser(Guid rsid)
{
    return db.ValidateUser(rsid);
}
  

‘db’ — это класс, содержащий методы для взаимодействия с базами данных. Это ни в коем случае не мой дизайн, это клиент, который хочет иметь возможность входить в систему с помощью ссылок Guid, будьте осторожны! 🙂

Спасибо

Комментарии:

1. Что происходит, когда вы добавляете это? Для меня это выглядит совершенно корректно…

2. Я не могу получить доступ к методу, поскольку он (я думаю) не разрешен в System.Web.Security. Класс MembershipProvider

3. Ах, я думал, что вы, возможно, пишете класс-оболочку и, возможно, могли бы предоставить свои собственные методы?

Ответ №1:

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

Что касается входа по идентификатору Guid, сделайте Guid именем пользователя, установите пароль равным null и сделайте что-то вроде этого:

     public override bool ValidateUser(string username, string password)
    {
        Guid parsedUsername;
        if (String.IsNullOrWhiteSpace(password) amp;amp; Guid.TryParse(username, out parsedUsername))
        {
            return ValidateUser(parsedUsername);
        }
        else
        {
            return db.ValidateUser(username, password);
        }
    }
  

В конечном итоге это полный взлом, но он достигает цели, поставленной вашим клиентом. Возможно, стоит напомнить им, что в ссылках guid безопасность НУЛЕВАЯ.

Ответ №2:

Как насчет того, чтобы просто передать строковое представление идентификатора Guid и преобразовать?

 public override bool ValidateUser(string username, string password)
{
    Guid rsid;

    if (Guid.TryParse(username, out rsid))
    {
        return db.ValidateUser(rsid);
    }
    else
    {
        return false;
    }
}
  

Комментарии:

1. Я думал о чем-то подобном. Я попробую

2. Это работает, но не очень хорошее решение для злоупотребления типом данных для чего-то другого.

Ответ №3:

Другой способ — добавить новый метод в MembershipProvider (вне определенного интерфейса), например:

 public class CustomMembershipProvider : MembershipProvider {

    private LoginValidationType ValidationType;

    // new method
    public bool ValidateUser(string username, string password, LoginValidationType validationType = LoginValidationType.WebsiteSpecific) {
        ValidationType = validationType;
        return ValidateUser(username, password);
    }

    // the original method
    public override bool ValidateUser(string username, string password) {
        // do stuff with username, password and this.ValidationType
    }
  

В вашем вызывающем коде теперь вы можете сделать:

         CustomMembershipProvider provider = new CustomMembershipProvider();
        // original method
        provider.ValidateUser("un", "pass"); 
        // or call our new overload
        provider.ValidateUser("un", "pass", LoginValidationType.WebsiteSpecific); 
  

Вместо:

         Membership.ValidateUser("un", "pass");
  

Но это все еще кажется хакерским. Простое добавление нового открытого метода не приводит к тому, что класс членства по умолчанию показывает метод, и я не знаю, можно ли его изменить, чтобы сделать это в любом случае.

По крайней мере, вам не нужно злоупотреблять типами данных таким образом и иметь методы для конкретных ситуаций.