Расширение Поставщика Членства В Active Directory
У меня есть 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 GetUser (string username, 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); } }
Примечание: вам нужно будет убедиться, что все методы, возвращающие пользователя, переопределены. Это также оказывает некоторое влияние на производительность методов сбора, потому что вам нужно будет дублировать коллекцию (как я показал в Примере).