Вот наша текущая установка. У нас настроен 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.
Мне кажется, что что-то не так с процессом выдачи себя за другое лицо. Что мне не хватает?