#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");
Но это все еще кажется хакерским. Простое добавление нового открытого метода не приводит к тому, что класс членства по умолчанию показывает метод, и я не знаю, можно ли его изменить, чтобы сделать это в любом случае.
По крайней мере, вам не нужно злоупотреблять типами данных таким образом и иметь методы для конкретных ситуаций.