Performing an ID check on a person and saving the result
You can use a mocking library, like MOQ, to "intercept" calls to _identityAuthenticationRepository, thus removing the physical database from the equation. And you want to do this because you do not want to be testing the Web Service. All you care about is what this code does with a given returned response.

It is troubling that you have catch (SqlException ex) at this level. Why is this not done in the repository? Besides separation of concerns, it blows the whole idea of an abstract repository out of the water. 

Your concerns about "too long" methods seems arbitrary to me. LogAndDoCheck() may be "too long", but why? It's not so much "too long" as it is not understandable. Not without reading all the code carefully. It needs to be structured to express what's happening "at this level of abstraction". In other words, Your "Description of..." suggests what the method should look like:

 public ... LogAndDoCheck() {
     var identityThingy = VerifyLocally();

     if(!identityThing.Verified)
         identityThingy = VerifyRemotely();

     if(!identityThingy.Verified)
         throw new InvalidUserException(identityThingy.ToString());
 }


The method is not arbitrary made short. It's short because of the layering of abstract functional details.

It is also shorter because we got the repository out of the way. Of course you gotta call the repository eventually, but that method is now shorter too. And put the SqlException catching there too. That obviously is the best place to capture any available details like parameter values.

And exception handling might better be done by try { LogAndDoCheck(); } catch .... 

P.S.

Instead of setting the IdentityCheck to null, have a property or other way of asking the object if the identity is invalid. That way you have the properties it was built with - user entry stuff I imagine - at hand and that can be included in Exception.Data.