Ошибка: не удалось войти в систему для пользователя 'NT AUTHORITY\ANONYMOUS LOGON'. в VB.Net

Хотя я нашел много сообщений с этой же ошибкой, я не смог найти исправимую или нет.

Существует база данных, на которую у меня есть разрешение на чтение с моим окном входа в сеть. Я просто использую SSMS для доступа к таблице, но у нее нет лучшего интерфейса в мире, поэтому я написал небольшой веб-сайт, который может подключаться к таблице и фильтровать данные, которые мне нужны, и отображать их красиво.

Я использую Integrated Security = SSPI (также пробовал TRUE), и до этого момента все работает нормально. Я запускаю сайт, используя VS2010. Но запуск веб-сайта с использованием VS2010 на самом деле не идеальная вещь, поэтому я поместил свой веб-сайт на IIS 7 на своей машине (то есть Localhost:xxx). И это когда я получил вышеуказанную ошибку.

Все эти проблемы можно исправить, если я смогу просто ввести пользователя в базу данных только с правами на чтение таблицы, которую я хочу прочитать, но в моем случае это просто невозможно. Там нет ничего, что я могу изменить с базой данных.

Так есть ли какая-нибудь работа по размещению веб-сайта на локальном IIS со строкой подключения, которая использует встроенную защиту и подключается к удаленной базе данных с учетными данными для входа в окно?

Благодарю.

1 ответ

Решение

Если вам известен идентификатор пользователя / пароль пользователя Windows, используемый при входе в систему интегрированной безопасности, вы можете попробовать следующий подход.

Сначала объявите вызовы функций Windows API:

Private Enum LogonSessionType As Integer
  Interactive = 2
  Network
  Batch
  Service
  NetworkCleartext = 8
  NewCredentials
End Enum

Private Enum LogonProvider As Integer
  WinDefault = 0
  WinNT35
  WinNT40
  WinNT50
End Enum

<DllImport("advapi32.dll", SetLastError:=True)> _
Private Shared Function LogonUser(ByVal userID As String, _
                                  ByVal domain As String, _
                                  ByVal password As String, _
                                  ByVal logonType As LogonSessionType, _
                                  ByVal LogonProv As LogonProvider, _
                                  ByRef token As IntPtr) As Boolean
End Function

<DllImport("kernel32.dll", SetLastError:=True)> _
Private Shared Function CloseHandle(ByVal handle As IntPtr) As Boolean

End Function

Затем объявите 2 вспомогательные функции

Sub BeginImpersonate(ByVal i_sUserID As String, ByVal i_sPassword As String, ByRef o_impersonatedUser As WindowsImpersonationContext, ByRef o_token As IntPtr)

    o_token = IntPtr.Zero
    o_impersonatedUser = Nothing

    Dim bLoginSuccessful As Boolean = LogonUser(i_sUserID, Nothing, i_sPassword, LogonSessionType.Interactive, LogonProvider.WinDefault, o_token)

    If bLoginSuccessful Then
         Dim id As New WindowsIdentity(o_token)
         o_impersonatedUser = id.Impersonate()
    Else
         Throw New Exception ("Logon failed: Error " & Marshal.GetLastWin32Error.ToString)
    End If

End Sub


Sub EndImpersonate(ByVal i_impersonatedUser As WindowsImpersonationContext, ByVal i_token As IntPtr)
    If i_impersonatedUser IsNot Nothing Then i_impersonatedUser.Undo()
    If i_token <> IntPtr.Zero Then CloseHandle(i_token)
End Sub

С этой подготовкой вы можете сделать такие звонки:

Dim impersonatedUser As WindowsImpersonationContext = Nothing
Dim token As IntPtr = IntPtr.Zero

BeginImpersonate(i_sUserID, i_sPassword, impersonatedUser, token)

'Do your DB stufff here, open connection etc.

EndImpersonate(impersonatedUser, token)

Этот код довольно сырой, но он работает. Вам нужно будет добавить соответствующую обработку ошибок и т. Д., Чтобы сделать ее рабочим кодом. Передайте идентификатор пользователя в формате "user @ domain" в параметре "i_sUserID" и пароль пользователя в параметре "i_sPassword".

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