Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Dillie-OОтветов: 2

Вот наша текущая установка. У нас настроен 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.

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

authenticationsql-serveractive-directory

Ответы

Ответ 1 · Will Marcouiller

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

Ответ 2 · Remus Rusanu

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

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.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы