Пользовательский ValidateUser () в пользовательском .net MembershipProvider - PullRequest
1 голос
/ 28 апреля 2011

Есть ли способ расширить метод 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, безопасно! :)

Спасибо

Ответы [ 3 ]

3 голосов
/ 28 апреля 2011

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

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

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

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

1 голос
/ 28 апреля 2011

Как насчет передачи строкового представления Guid и конвертации?

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

    if (Guid.TryParse(username, out rsid))
    {
        return db.ValidateUser(rsid);
    }
    else
    {
        return false;
    }
}
0 голосов
/ 08 октября 2014

Другим способом является добавление нового метода в 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");

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

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

...