Как настроить проверку подлинности с помощью форм с помощью WindowsIdentity и встроенной безопасности SQL Server

Вот наша текущая установка. У нас настроен Active Directory (домен с именем mis1), который решает все наши проблемы с аутентификацией. У нас есть настройки наших веб-приложений для impersonation = true, чтобы мы могли вызывать запросы к базе данных, когда пользователь вошел в систему. Для этого конкретного приложения IIS установлен на анонимный доступ, чтобы мы могли иметь аутентификацию с помощью форм.

Для нашей безопасности базы данных у нас есть настройка локальных групп на сервере базы данных и добавление пользователей в эти группы по мере необходимости для каждого приложения. Например, у нас будет группа «FancyPantsManager» и группа «FancyPantsUser» для одного и того же приложения FancyPants. Затем мы настраиваем учетные записи SQL Server 2005 для сопоставления с этими локальными группами на сервере.

Что я хочу сделать, так это представить страницу входа для пользователя, который аутентифицируется вне AD, а затем, в случае успеха, переходит на сервер базы данных, чтобы получить свои роли (путем вызова xp_logininfo) для сохранения в сеансе пользователя.

Пока что у меня есть проверка подлинности с помощью форм, успешно прошедшая проверку подлинности вне Active Directory, выполнив p / Invoke для метода LogonUser из файла avapi32.dll. Затем я беру полученный токен, создаю объект WindowsIdentity и выдаю себя за пользователя. Код выглядит так:

Private Sub loginMain_Authenticate _
               (ByVal sender As Object, _
                ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) _
        Handles loginMain2.Authenticate

   ' Assume variables properly declared

   IsAuthenticated = LogonUser(UserName, LOGON_DOMAIN, UserPass, 
                               LOGON_TYPE, LOGON_PROVIDER, ResultToken)

   If IsAuthenticated

      ' Setup impersonation for validated user.
      WindowsId = New WindowsIdentity(ResultToken)
      IdentContext = WindowsId.Impersonate()

      ' Call stored procedure to retrieve roles using validated user for login.
      GetUserRoles(UserName)

   End If

End Sub

Когда я прохожу через отладчик и ввожу свой правильный идентификатор и пароль. Я аутентифицирован и, глядя на созданный объект WindowsIdentity, он указывает, что мой идентификатор - «mis1 \ c07884», что как раз и необходимо для олицетворения, чтобы добраться до SQL Server. Однако при вызове метода GetRoles я получаю следующее сообщение об ошибке:

System.Data.SqlClient.SqlException: Could not obtain information 
about Windows NT group/user 'c07884', error code 0xffff0002.

Мне кажется, что что-то не так с процессом выдачи себя за другое лицо. Что мне не хватает?


person Dillie-O    schedule 24.09.2009    source источник


Ответы (2)


Может помочь ответ на этот вопрос? Active Directory: получение информации о пользователе

person Will Marcouiller    schedule 24.09.2009
comment
Неа! ... Я думаю, это не то, что ты хочешь, не так ли? - person Will Marcouiller; 24.09.2009
comment
Закрыть, но мне нужен токен авторизации, чтобы я мог подключиться к базе данных, а также сохранить часть билета для веб-сеанса пользователя. - person Dillie-O; 24.09.2009

Отредактировано для удаления нерелевантного содержания.

xp_logininfo. Похоже, вы вызываете его, передавая имя учетной записи как имя пользователя без домена. Что на самом деле объясняет, почему в сообщениях об ошибках написано c07884 not found, а не mis1\c07884 not found, как должно. Ошибка 0xFFFF002, вероятно, ошибка 2 ERROR_FILE_NOT_FOUND.

Сейчас самое быстрое исправление, вероятно, - передать правильное имя учетной записи:

GetUserRoles(string.Format("{0}\\{1}"), LOGON_DOMAIN, UserName));

Вам следует подумать о том, чтобы переписать процедуру для получения олицетворенной информации о пользователе, вызвав x_logininfo без аргументов, чтобы вернуть информацию о текущем пользователе. Еще лучше, просто SELECT * FROM sys.login_token.

Если все, что вам нужно для ASP, - это членство в группе, оно у вас уже есть в WindowsIdentity.Groups.

person Remus Rusanu    schedule 24.09.2009
comment
Проблема, с которой я столкнулся с WindowsIdentity.Groups, заключается в том, что группы являются локальными для сервера базы данных, а не для имени домена в целом. Смогут ли группы получать членство с отдельных серверов, а не с домена? - person Dillie-O; 25.09.2009
comment
Когда я вызываю GetUserRoles, строка подключения настраивается на использование SSPI, что, как я предполагаю, означает, что она будет принимать олицетворенные учетные данные зарегистрированного WindowsIdentity, которые по какой-то причине возвращаются как просто c07884 без домена, есть ли способ обновить имя, связанное с логином? - person Dillie-O; 25.09.2009
comment
Присоединен ли хост базы данных к домену mis1 (или он присоединен к домену, который доверяет mis1)? - person Remus Rusanu; 25.09.2009
comment
Хороший вопрос. На данный момент я не уверен. Я хочу сказать «да», но мне нужно поговорить об этом с нашими ребятами из оперативного отдела. - person Dillie-O; 25.09.2009