I figured it out. Adding in a header in the correct spot made all the difference:
my $lite = SOAP::Lite->new()->on_action(sub { join '/', @_ } )
->proxy($args->{proxy}),
SOAP::Header->name('Authentication' =>
SOAP::Header->value(
SOAP::Header->name('user')->value($zID),
SOAP::Header->name('password')->value($zPW)));
my $response = $lite->call(
SOAP::Data->name('fetchAndLock')
->attr({ 'xmlns', $args->{xmlns}}),
SOAP::Data->name("first")->value($args->{first}),
SOAP::Data->name("max")->value($args->{max}),
SOAP::Data->name("provider")->value($args->{provider}),
SOAP::Data->name("action")->value($args->{action}),
SOAP::Data->name("state")->value($args->{state}),
);