Ah, I knew there was something. Are you using impersonation by any chance? That definitely doesn't make it to background threads. If that's the case then you need to store the WindowsIdentity in a class level member variable, then wrap you threaded bits in impersonation calls;

 

public partial class _Default : System.Web.UI.Page
{
    private WindowsIdentity threadIdentity;

    protected void Page_Load(.....)
    {
        this.threadIdentity = Context.User.Identity as WindowsIdentity;

        // And then you kick off your thread
       Thread thread = new Thread(new ThreadStart(RunMe));
       ....        
    }

    protected void RunMe()
    {
        IntPtr token = IntPtr.Zero;
        WindowsImpersonationContext impersonatedUser = null;
        try
        {
                WindowsIdentity id =this.threadIdentity;
                impersonatedUser = id.Impersonate();
                // Now I'm the right user, do stuff
        }
        catch
        {
        }
        finally
        {
            if (impersonatedUser != null)
                impersonatedUser.Undo();

            if (token != IntPtr.Zero)
                CloseHandle(token);
        }        
    }
}