2017-01-13 2 views
0

У меня есть код, который получает пользователя на основе текущего контекста, и это происходит в методе Page_Load() моего приложения.Active Directory UserPrincipal issue

var context = new PrincipalContext(ContextType.Domain, "dc", "DC=domain,DC=com", "user", "password"); 
UserPrincipal user = UserPrincipal.FindByIdentity(context, User.Identity.Name); 
string Name = user.Name.Trim(); 
lblName.Text = Name; 

Это работает, и метка правильно показывает зарегистрированного пользователя (аутентификация Windows).

Однако, другая часть моего кода при нажатии кнопки выполняет некоторую циклическую обработку данных, содержащую другие имена пользователей, и использует аналогичный метод для получения информации об этих пользователях.

Я использовал ярлыки на странице, чтобы отображать соответствующую информацию пользователя, но одна из этих меток, похоже, меняется на основе того, с каким пользователем она работает в цикле, когда ей действительно нужно только ссылаться только на текущий вход в систему пользователь.

Есть ли способ обойти это? Я думал, что, имея отдельные методы, которые по сути делают то же самое, я получаю разные объекты. Возвращаемые значения различны, поэтому я не уверен, как это происходит.

Соответствующий код, приведенный ниже, с некоторыми комментариями, чтобы объяснить или указать, где код не имеет значения (отправка сообщений электронной почты и устранение исключений - все удалены).

public string getUserEmail() 
{ 
var context = new PrincipalContext(ContextType.Domain, "dc", "DC=domain,DC=com", "user", "password"); ; 
UserPrincipal user = UserPrincipal.FindByIdentity(context, User.Identity.Name); 
string email = user.EmailAddress; 
return email; 
} 

public string getOtherUserEmail(string user) 
{ 
user = user.Trim(); 
var context = new PrincipalContext(ContextType.Domain, "dc", "DC=domain,DC=com", "user", "password"); 
UserPrincipal u = UserPrincipal.FindByIdentity(context, user); 
string email2= u.EmailAddress; 
return email2; 
} 

protected void btnEmail_Click(object sender, EventArgs e) 
{ 
    foreach (GridViewRow row in gdView1.Rows) 
    { 
     if (row.RowType == DataControlRowType.DataRow) 
     { 
      Label FullName = gdView1.Rows[index].FindControl("lblFullName") as Label; // other username from gridview 
      string FromAddress = getUserEmail(); //logged in user 
      try 
      { 
       string otherName = FullName.Text.ToString(); 
       string ToAddress1 = getOtherUserEmail(FullName); //Other user 
       //Generate an email message.... 
       smtpClient.Send(mail); 
       lblMessage.Text = "Email sent!"; 
      } 
      catch 
      { // exception handling 
      } 
    } 
} 

protected void gdView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
     { 
      TableCell cell = gdView1.Rows[e.RowIndex].Cells[2]; //Cell containing "other" user name 
      Message.Text = cell.Text; 
      string otherName = cell.Text.ToString(); 
      string ToAddress = getOtherUserEmail(otherName); //Other user 
      string FromAddress = getUserEmail(); //logged in user 
      try 
      { //email as above 
      } 
      catch 
      { // exception handling 
      } 
    } 

ответ

2

Основываясь на том, что вы опубликовали, я ожидаю, что вы также получите разные объекты. Может быть, что-то происходит в коде, который вы не включили?

На боковой ноте для текущего пользователя вы должны указать поле (назовите его _loggedOnUser) за пределами Page_Load(). Таким образом, все методы имеют к нему доступ. Это также упростит ваш код, а также поможет решить вашу проблему.

public partial class Page1 { 

    UserPrincipal _loggedOnUser; 

    public void Page_Load() { 
     var context = new PrincipalContext(ContextType.Domain, "dc", "DC=domain,DC=com", "user", "password"); 
     _loggedOnUser= UserPrincipal.FindByIdentity(context, User.Identity.Name); 
     string Name = _loggedOnUser.Name.Trim(); 
     lblName.Text = Name; 
    } 

} 

Тогда вы можете обратиться к нему в остальной части вашего класса, и вам не придется тратить время, уходящую в Active Directory в цикле.

Таким образом, эта линия: string FromAddress = getUserEmail();

может быть изменена на string FromAddress = _loggedOnUser.EmailAddress;

и избежать другого дорогого звонка в AD, чтобы получить информацию, которую Вы уже имеете.

+0

Спасибо - это имеет смысл, хотя я получаю предупреждение с помощью новой переменной: 'Поле 'Project._default._loggedOnUser' никогда не назначается и всегда будет иметь значение по умолчанию null. Я попытался инициализировать его нулевым значением, но это тоже не понравилось. –

+0

Вы изменили код в 'Page_Load()', чтобы инициализировать его? Если это так, попробуйте установить контрольную точку, чтобы увидеть, попадает ли она. – squillman

+0

Я забыл этот бит. Выяснилось, что (плохой) код обработки исключений приводит к тому, что моя метка ошибки содержит имя другого пользователя. Буквально не знаю, как это происходит, поэтому я попытаюсь отладить! Спасибо за вашу помощь, хотя, я буду отмечать это как ответ. –