HttpContext.Current.User не заполнен с включенной аутентификацией Windows
У меня есть приложение для интрасети asp.net, использующее аутентификацию Windows. Я создал приложение несколько лет назад с VS 2005, и бит проверки подлинности Windows работал отлично. Мой web.config имеет следующее (внутри конфигурации -> элемент system.web):
<authentication mode="Windows" />
<authorization>
<deny users="?"/>
</authorization>
Я проверяю это в Firefox, чтобы подтвердить, что учетные данные требуются, и, действительно, у меня запрашивают сетевые учетные данные при первом доступе к сайту, и мне отказывают, если они недействительны.
Однако, когда я пытаюсь получить доступ к HttpContext.Current.User.Identity, у объекта появляются пустые строки для Name и AuthenticationType, а Authenticated = false. Я подумал, что мне может понадобиться включить WindowsTokenRoleProvider после осмотра межплетений, и это ничего не изменило.
<roleManager defaultProvider="WindowsProvider" enabled="true" cacheRolesInCookie="false">
<providers>
<clear/>
<add name="WindowsProvider" type="System.Web.Security.WindowsTokenRoleProvider"/>
</providers>
</roleManager>
Две вещи, которые я сделал с тех пор, как в последний раз видел, как это работает, - это обновить проект до VS 2008 с помощью мастера конвертации, и я также отложил его на несколько месяцев, пока мои коллеги работали над этим здесь или там., Я был почти уверен, что единственное, что влияет на мой User.Identity, это значения в файле web.config, упомянутые выше, но, видимо, я что-то делаю не так. Кто-нибудь еще сталкивался с подобной проблемой или видел что-то, что я делаю неправильно? Благодарю.
6 ответов
Я считаю, что вам нужно убедиться, что анонимный доступ отключен в IIS для сайта / виртуального.
Убедитесь, что ваш <httpModules>
раздел не был очищен. Файл web.config вашей машины должен содержать фрагмент, подобный следующему:
<httpModules>
<!-- ... -->
<add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" />
<!-- ... -->
<add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" />
<!-- ... -->
</httpModules>
Важным элементом здесь является WindowsAuthentication
, Убедитесь, что это в вашем %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\CONFIG\Web.config
файл. Кроме того, убедитесь, что как ваш собственный веб-сайт, так и любой файл web.config, который появляется на "родительском" сайте или в папке сайта, не имеют <clear/>
тег в его <httpModules>
раздел. Без WindowsAuthentication
модуль, не имеет значения, заставит ли вас браузер войти в систему или нет... ASP.NET никогда не установит User
собственность без этого модуля включена.
Заказ httpModules
также важно, и, в частности, я считаю, WindowsAuthentication
модуль должен появиться до AnonymousIdentification
один.
Попробуйте добавить, чтобы получить поведение, которое вы хотите? Когда олицетворение не включено, многое происходит под именем NETWORK SERVICES или пользователя ASPNET
И вот сообщение в блоге Hanselman, у которого есть другая сумасшедшая идея, которая пришла в голову:
Где вы проверяете этого пользователя? В цикле запроса происходят некоторые события до авторизации.
Если вы тестируете на Vista, Windows 7 или Windows Server 2008, могут быть и другие различия, поскольку конвейер ASP.Net и IIS интегрированы в конфигурацию IIS 7 по умолчанию.
Некоторые идеи:
В конфигурации сайта откройте диалоговое окно "Параметры конфигурации ASP.NET". На вкладке "Аутентификация" установлен ли "Режим аутентификации" на "Windows" ()? На вкладке "Приложение" настроено ли "Локальное олицетворение" (думаю, его не нужно проверять).
Ваш сервер был удален из домена? Изменился ли пользователь, выполняющий пул приложений? Изменились ли доменные политики, не позволяя серверу выдавать себя за пользователя для проверки подлинности (не делегирования)?
Вы пробовали переустановить расширения asp.net для своего сайта? (Это большая тема сама по себе.)
Вы можете проверить флаг HttpContext.SkipAuthorization программно.