2

我有一个将使用Active Directory存储用户的ASP.NET网站。 有一个要求允许用户使用他们的电子邮件作为用户名。 活动目录不允许在用户名中使用“@”等字符。 我创建了一个类来扩展ActiveDirectoryMembershipProvider;它在调用基类函数之前将用户名([email protected])转换为user_x0040_domain.com。 例如:扩展Active Directory成员资格提供程序

public override bool ValidateUser(string username, string password) 
     { 
      string encodedUsername = this.Encode(username); 
      return base.ValidateUser(encodedUsername, password); 
     } 

存在的问题是,在的MembershipUser不允许改变用户名。 如何处理覆盖返回MembershipUser的方法? 一样的MembershipUser的getUser(用户名字符串,布尔userIsOnline)

回答

1

我想你可以做到这一点压倒一切由Active Directory提供返回的MembershipUser,像这样:

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); 
    } 
} 

注意:您将需要确保所有返回用户的方法被重写。它也会对收集方法产生一些性能影响,因为您需要复制收集(如示例中所示)。

相关问题