You can work any of two ways.
1. You can choose not to impersonate in web.config. In this case, you
simply selectively impersonate in your application using
WindowsIdentity.Impersonate(). You can get the WindowIdentity from
(WindowsIdentity) ( (WindowsPrincipal) Page.User ).Identity.
2. You can choose to impersonate in web.config. In this case, you
selectively revert impersonation to ASPNET using the static method,
WindowsIdentity.Impersonate( IntPtr.Zero ). You can resume impersonation
using WindowsImpersonationContext.Undo().
Tks Jim,
It worked fine! Here's the code:
' The caller
Dim iu As New ImpersonateUser
If iu.impersonateValidUser("testUser", "MyDomain", "test1234") Then
'Insert your code that runs under the security context of a
specific user here.
Dim iop As New InteropTest.Net.Hello
Response.Write(iop.World)
Marshal.ReleaseComObject(iop)
iu.undoImpersonation()
Else
'Your impersonation failed. Therefore, include a fail-safe
mechanism here.
Response.Write("Did you think that it would work?")
End If
' The class
Imports System.Security.Principal
Imports System.Runtime.InteropServices
Public Class ImpersonateUser
Dim LOGON32_LOGON_INTERACTIVE As Integer = 2
Dim LOGON32_PROVIDER_DEFAULT As Integer = 0
Dim impersonationContext As WindowsImpersonationContext
Private Declare Function LogonUserA Lib "advapi32.dll" (ByVal
lpszUsername As String, _
ByVal lpszDomain As String, _
ByVal lpszPassword As String, _
ByVal dwLogonType As Integer, _
ByVal dwLogonProvider As Integer, _
ByRef phToken As IntPtr) As Integer
Private Declare Auto Function DuplicateToken Lib "advapi32.dll" ( _
ByVal ExistingTokenHandle As IntPtr, _
ByVal ImpersonationLevel As Integer, _
ByRef DuplicateTokenHandle As IntPtr) As Integer
Private Declare Auto Function RevertToSelf Lib "advapi32.dll" () As Long
Private Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal
handle As IntPtr) As Long
Public Function impersonateValidUser(ByVal userName As String, ByVal
domain As String, ByVal password As String) As Boolean
Dim tempWindowsIdentity As WindowsIdentity
Dim token As IntPtr = IntPtr.Zero
Dim tokenDuplicate As IntPtr = IntPtr.Zero
impersonateValidUser = False
If RevertToSelf() Then
If LogonUserA(userName, domain, password,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, token) <> 0 Then
If DuplicateToken(token, 2, tokenDuplicate) <> 0 Then
tempWindowsIdentity = New
WindowsIdentity(tokenDuplicate)
impersonationContext = tempWindowsIdentity.Impersonate()
If Not impersonationContext Is Nothing Then
impersonateValidUser = True
End If
End If
End If
End If
If Not tokenDuplicate.Equals(IntPtr.Zero) Then
CloseHandle(tokenDuplicate)
End If
If Not token.Equals(IntPtr.Zero) Then
CloseHandle(token)
End If
End Function
Public Sub undoImpersonation()
impersonationContext.Undo()
End Sub
End Class