У меня есть код, который получает пользователя на основе текущего контекста, и это происходит в методе 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
}
}
Спасибо - это имеет смысл, хотя я получаю предупреждение с помощью новой переменной: 'Поле 'Project._default._loggedOnUser' никогда не назначается и всегда будет иметь значение по умолчанию null. Я попытался инициализировать его нулевым значением, но это тоже не понравилось. –
Вы изменили код в 'Page_Load()', чтобы инициализировать его? Если это так, попробуйте установить контрольную точку, чтобы увидеть, попадает ли она. – squillman
Я забыл этот бит. Выяснилось, что (плохой) код обработки исключений приводит к тому, что моя метка ошибки содержит имя другого пользователя. Буквально не знаю, как это происходит, поэтому я попытаюсь отладить! Спасибо за вашу помощь, хотя, я буду отмечать это как ответ. –