I just had a similar problem. The Thread used by BeginInvoke doesn't copy the windowsIdentity from the calling thread. You have to impersonate the new thread manually:
Before calling BeginInvoke save the current identity into a variable (vb.net code):
Dim identity as WindowsIdentity
identity = System.Security.Principal.WindowsIdentity.GetCurrent()
Inside the method executed asynchronously called method use this variable and execute
From that point on the asynchronous call uses the same priviliges than the calling thread and it should not be a problem to execute the callback.