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 программно.

Вы пытались добавить олицетворение личности:

<identity impersonate="true" />

в web.config?

Другие вопросы по тегам