@HuroSwords 答案中的ExtensionGet方法不能直接使用,因为它是受保护的方法。
正如在其他地方提到的,您需要创建自己的子类才能使用它。我在下面提供了一个我过去为获得额外用户属性所做的示例。
[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("User")]
public class UserPrincipalExtended : UserPrincipal
{
public UserPrincipalExtended(PrincipalContext context) : base(context)
{
}
// Implement the overloaded search method FindByIdentity to return my extended type
public static new UserPrincipalExtended FindByIdentity(PrincipalContext context, string identityValue)
{
return (UserPrincipalExtended)FindByIdentityWithType(context, typeof(UserPrincipalExtended), identityValue);
}
// Implement the overloaded search method FindByIdentity to return my extended type
public static new UserPrincipalExtended FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue)
{
return (UserPrincipalExtended)FindByIdentityWithType(context, typeof(UserPrincipalExtended), identityType, identityValue);
}
[DirectoryProperty("physicalDeliveryOfficeName")]
public string Department
{
get
{
if (ExtensionGet("physicalDeliveryOfficeName").Length != 1)
return null;
return (string)ExtensionGet("physicalDeliveryOfficeName")[0];
}
}
}
然后像使用普通 UserPrincipal 对象一样使用子类。
var domain = new PrincipalContext(ContextType.Domain);
var userPrincipal = UserPrincipalExtended.FindByIdentity(domain, HttpContext.Current.User.Identity.Name);
Console.WriteLine(userPrincipal.Location);
在您的情况下,您可能需要重新获取委托人。