I've solved this by using the ObjectsApi to generate a signed URL and removing the authorisation header from the request.
        ObjectsApi objectsApi = new ObjectsApi(new ClientCredentials(_clientId, _clientSecret));
        var resource = await _ossClient.CreateSignedResourceAsync(bucketKey,
            resultKey,
            new CreateSignedResource(),
            Access.ReadWrite,
            true, accessToken: token.AccessToken);
        
        var outputFileArgument = new XrefTreeArgument()
        {
            Url = resource.SignedUrl,
            Verb = Verb.Put
        };