I'd create a DataAccessAdapter factory, which returns a DataAccessAdapter object which is initialized with a connection string to use, and you code your application against IDataAccessAdapter. You then pass in the user credentials to the factory which then produces the right DataAccessAdapter instance.
Or do you need additional features for your impersonation? The DataAccessAdapter just executes queries over the connection made using the connection string passed in.