Update
Поместите это вверху, потому что это безумие:)
Итак, некоторые пользователи работают, а некоторые нет. Когда я использую свою собственную учетную запись через IE7, она не работает (мой код ловит исключение и возвращается к простому использованию имени идентификации вместо имени AD). Когда я пытаюсь через Chrome, он запрашивает у меня имя пользователя и пароль, которые я предоставляю, и отображается полное имя. Таким образом, учетная запись пользователя, код сервера и настройки идентичны, но использование другого браузера для отправки аутентификации заставляет его работать.
Я также удалил все файлы cookie из IE7, перезапустил и не изменил поведение IE. Множество пользователей IE7 работают нормально.
Обновление # 2
Удаленный вход в другую машину, перешел на страницу в IE7, и он показывает мое полное имя. Нет подсказки. Я думал, что сеанс кэшировал что-то, но я переиздал приложение, и это должно очистить сеанс. Я думал, что у печенья был старый/плохой токен, но я очистил их и попробовал еще раз. Что-то где-то должно получиться долгосрочное кэширование. Надеюсь, что он сам работает.
Окончание обновлений
Здравствуйте,
Я получаю полное имя пользователя из нашего AD в приложении ASP.NET(MVC), работающем на IIS 6.0.
string domainUser = filterContext.HttpContext.User.Identity.Name;
WindowsIdentity windowsIdentity = filterContext.HttpContext.User.Identity as WindowsIdentity;
WindowsImpersonationContext impersonationContext = windowsIdentity.Impersonate();
DirectoryEntry userEntry = new DirectoryEntry("WinNT://" + domainUser.Replace('\\', '/') + ",User");
filterContext.Controller.ViewData["User"] = (string)userEntry.Properties["fullname"].Value;
Последняя строка генерирует исключение: "Ошибка входа в систему: неизвестное имя пользователя или неверный пароль".
Если я посмотрю на HttpContext.User.Identity, это действительный пользователь домена и WindowsIdentity.GetCurrent выдает себя правильно.
Это исключение, похоже, не будет выбрано в 100% случаев, и оно не будет выбрано при просмотре с сервера IIS.
Мой web.config выглядит так:
<authentication mode="Windows"/>
<authorization>
<deny users="?"/>
</authorization>
<identity impersonate="false"/>
Меня беспокоит то, что если я удалю линию олицетворения:
WindowsImpersonationContext impersonationContext = windowsIdentity.Impersonate();
Это работает. WindowsIdentity.GetCurrent является NT AUTHORITY\NETWORK SERVICE, который не является пользователем домена, но не генерируется исключение, и полное имя извлекается из AD.
Последний бит состоит в том, что это, похоже, только начиналось с нового развертывания приложения (от теста до живого). Я не знаю, отсутствует ли у меня параметр IIS или что, но код не изменился.
Я знаю, что мне раньше нужно было заклеймить себя, чтобы заставить его работать, и мне кажется, что мне нужно выдать себя за себя, поэтому я не решаюсь удалить вызов олицетворения, не зная, что происходит, и почему эта ошибка сейчас происходит.
Спасибо.
Я подозреваю, что проблема заключается в том, что сервер, на котором размещено ваше приложение ASP.NET, не доверяет делегированию. Google для "доверенных для делегирования" для получения дополнительной информации или эта статья MSDN является хорошей отправной точкой.