Thank you again for looking. No, I don't have a principleAttributeList defined for any of my three identity providers.
I also tried setting:
cas.personDirectory.attributeResolutionEnabled: true
cas.personDirectory.activeAttributeRepositoryIds: JDBCAttributeRepository
where JDBCAttributeRepository matches the value given to
cas.authn.attribute-repository.jdbc[0].id
to try and force the attribute resolution regardless of which source I used for authentication, but it didn't seem to have any effect, and I really can't tell from the descriptions what these settings are intended to be used for.
One difference is that I am using cas.authn.pac4j.core.discovery-selection.selection-type: MENU so I am choosing AzureAD by pressing a button from a list on the side of the CAS login form rather than simply typing my username and password into the form directly, but since it still seems to use the same mechanism for resolving the attributes I'm not sure why that would make a difference.