Ошибка: не удалось войти в систему для пользователя '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".