A new user (associated with an existing login) is created in msdb and assigned membership:
use [msdb]; create user [TheUser] for login [AnExistingLogin]; alter role [SQLAgentUserRole] add member [TheUser]; alter role [SQLAgentReaderRole] add member [TheUser]; -- Impersonate the user via an SP in another DB with execute as... select top 10 * from msdb.dbo.sysjobs; -- fail The SELECT permission was denied on the object 'sysjobs', database 'msdb', schema 'dbo'.
Try the obvious:
grant select on msdb.dbo.sysjobs to [TheUser] select top 10 * from msdb.dbo.sysjobs; -- success
Isn't the proper way to work within the SQLAgent* roles?