IIS / DirectoryEntry / ASP.NET - ошибка входа - PullRequest
2 голосов
/ 29 июня 2009

Обновление

Ставить это сверху, потому что это безумие :) 1005 *

Так что у некоторых пользователей это работает, у некоторых нет. Когда я использую свою собственную учетную запись через IE7, она не работает (мой код перехватывает исключение и возвращается к простому использованию идентификационного имени вместо полного имени AD). Когда я пытаюсь через Chrome, он запрашивает у меня имя пользователя и пароль, которые я предоставляю, и отображается полное имя. Таким образом, учетная запись пользователя, код сервера и настройки идентичны, но использование другого браузера для отправки аутентификации делает его работоспособным.

Я также удалил все куки из IE7, перезапустил, и в поведении IE не было никаких изменений. У многих пользователей IE7 все работает нормально.

Обновление № 2

Удаленно вошел на другую машину, зашел на страницу в IE7, и там отображается мое полное имя. Понятия не имею. Я думал, может быть, сессия что-то кэширует, но я переиздал приложение, и это должно очистить сессию. Я думал, что, возможно, печенье имеет старый / плохой токен, но я очистил его и попробовал снова. Что-то где-то должно быть долгосрочное кэширование. Надеюсь, все получится.

Конечные обновления

Hello

Я получаю полное имя пользователя из нашей 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 или что-то еще, но код не изменился.

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

Спасибо.

1 Ответ

1 голос
/ 29 июня 2009

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

...