错误:用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败。在VB.Net中

时间:2013-06-10 14:56:05

标签: asp.net vb.net connection-string database-permissions integrated-security

虽然我发现很多帖子都有同样的错误,但我找不到我的错误是否可修复。

我有一个数据库,我已经通过网络登录窗口获得了读取权限。我只是用SSMS访问表,但是这是不是真的有世界上最好的接口,所以我写了一个小网站,可以连接到表和过滤我想要的数据,并很好地显示出来。

我使用集成安全性= SSPI(也尝试了TRUE),直到这一点它都可以正常工作。我使用VS2010运行网站。但是使用VS2010运行网站并不是理想的事情,所以我把我的网站放在我的机器上的IIS 7上(即Localhost:xxx)。这是我得到上述错误的时候。

所有这些问题都可以解决,如果我只是在数据库中获得一个用户,只对我想要阅读的表有读权限,但这在我的情况下是不可能的。我无法改变数据库。

那么有没有办法在本地IIS上托管网站,其连接字符串使用集成安全性并使用窗口登录凭据连接到远程数据库?

感谢。

1 个答案:

答案 0 :(得分:1)

如果您知道在集成安全登录中使用的Windows用户的用户ID /密码,您可以尝试以下方法。

首先声明对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)

这段代码有点原始,但它有效。您需要添加适当的错误处理等,以使其成为生产代码。在“i_sUserID”参数中以“user @ domain”格式传递用户ID,在“i_sPassword”参数中传递用户密码。