#asp.net-membership #membership-provider #custom-membershipprovider #activedirectorymembership
#asp.net-членство #поставщик членства #пользовательское-membershipprovider #activedirectorymembership
Вопрос:
У меня есть ASP.NET веб-сайт, который будет использовать Active Directory для хранения пользователей. Существует требование разрешить пользователям использовать свои электронные письма в качестве имени пользователя. Active Directory не допускает использования символов типа «@» в именах пользователей. Я создал класс для расширения ActiveDirectoryMembershipProvider; Он преобразует имена пользователей из (user@domain.com чтобы user_x0040_domain.com ) перед вызовом функций базового класса. пример:
public override bool ValidateUser(string username, string password)
{
string encodedUsername = this.Encode(username);
return base.ValidateUser(encodedUsername, password);
}
Проблема в том, что в MembershipUser не позволяет изменять имя пользователя.
Как я могу справиться с переопределением методов, возвращающих MembershipUser?
Например, MembershipUser getUser(строковое имя пользователя, bool userIsOnline)
Ответ №1:
Я полагаю, вы могли бы сделать это, переопределив MembershipUser, возвращаемый поставщиком Active Directory, примерно так:
public class MyActiveDirectoryMembershipProvider : ActiveDirectoryMembershipProvider
{
public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
{
ActiveDirectoryMembershipUser user = (ActiveDirectoryMembershipUser)base.GetUser(providerUserKey, userIsOnline);
if (user == null)
return null;
return new MyActiveDirectoryMembershipUser(user);
}
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
{
MembershipUserCollection newColl = new MembershipUserCollection();
foreach (ActiveDirectoryMembershipUser user in base.FindUsersByName(usernameToMatch, pageIndex, pageSize, out totalRecords))
{
newColl.Add(new MyActiveDirectoryMembershipUser(user));
}
return newColl;
}
// TODO: check other methods to override
}
public class MyActiveDirectoryMembershipUser : ActiveDirectoryMembershipUser
{
private string _userName;
public override string UserName
{
get
{
return _userName;
}
}
public MyActiveDirectoryMembershipUser(ActiveDirectoryMembershipUser user)
{
// TODO: do your decoding stuff here
_userName = MyDecode(user.Email);
}
}
ПРИМЕЧАНИЕ: вам нужно будет убедиться, что все методы, возвращающие пользователя, переопределены. Это также оказывает некоторое влияние на производительность методов сбора, поскольку вам нужно будет дублировать коллекцию (как я показал в примере).