2

이 오류가있는 많은 게시물을 발견했지만 내 오류 수정 가능 여부를 찾을 수 없습니다.오류 : 'NT AUTHORITY ANONYMOUS LOGON'사용자 로그인에 실패했습니다. VB.Net에서

네트워크에 내 창 로그인으로 읽기 권한이있는 데이터베이스가 있습니다. 나는 SSMS를 사용하여 테이블에 액세스하지만 실제로는 세계 최고의 인터페이스를 갖고 있지 않으므로 테이블에 연결하여 원하는 데이터를 필터링하고 멋지게 표시 할 수있는 작은 웹 사이트를 작성했습니다.

나는 Integrated Security = SSPI (TRUE로 시도 함)를 사용하며이 시점까지는 모두 제대로 작동합니다. VS2010을 사용하여 웹 사이트를 운영합니다. VS2010을 사용하여 웹 사이트를 운영하는 것은 이상적인 일이 아니므로 내 웹 사이트 (예 : Localhost : xxx)를 IIS 7에 설치해야합니다. 그리고 위의 오류가 발생했습니다.

내가 읽으려는 테이블에 대한 읽기 권한 만있는 데이터베이스에서 사용자를 얻을 수는 있지만 모든 경우에 문제가 해결 될 수 있지만 모든 경우에 문제가 해결 될 수 있습니다. 내가 데이터베이스로 변경할 수있는 것은 아무것도 없다.

통합 보안을 사용하고 창 로그인 자격 증명을 사용하여 원격 데이터베이스에 연결하는 연결 문자열로 로컬 IIS에서 웹 사이트를 호스팅하려면 어떤 문제가 있습니까?

감사합니다.

+0

가장은 가능하지만 실제로 권장하지는 않습니다. DB가 SQL Server 로그인을 허용 할 수 있다면 훨씬 좋을 것입니다 (SQL Server를 사용하고 있다고 가정합니다) –

+0

@YuriyGalanter .. 의견을 보내 주셔서 감사합니다. 가장을 시작할 때 조금만 설명해 주시겠습니까? – lawphotog

+0

ASP.NET 계정 –

답변

1

통합 보안 로그인에 사용되는 Windows 사용자의 사용자 ID/암호를 알고있는 경우 다음 방법을 시도해 볼 수 있습니다.

먼저 선언은 Windows API 함수 호출 :

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) 

이를 :

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 

그런 다음이 개 도우미 기능이 같은 통화를 할 수 있습니다 만든이 준비와

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 

선언 코드는 일종의 원시이지만 작동합니다. 프로덕션 코드로 만들려면 적절한 오류 처리 등을 추가해야합니다. "i_sUserID"매개 변수의 "user @ domain"형식과 "i_sPassword"매개 변수의 사용자 암호를 전달하십시오.

+0

에서 실행되는 동안 Windows API를 사용하여 사용자를 가장하는 코드 예제를 추가했습니다. 이것은 화려한 화려한 Yuriy입니다. 많은 감사 ... – lawphotog