The brief story: CAS never kicks off the multifactor trusted device registration webflow. I've tried this with just about every version of CAS 6, most recently with 6.1.2 and a large number of 6.2.0 snapshots. I've tested this with Google Authenticator, using both Redis and JSON for token storage, as well as CAS Simple MFA. I'm posting the very stripped-down configuration I've tried against a bare overlay template, but this has also been tested in a much more fully fledged environment with an LDAP backend, Redis ticket storage, etc. etc..
What stands out to me is that this was working before, at the beginning of the year, I believe. That leads me to suspect that something changed such that I am effectively misconfiguring the trusted MFA settings. Otherwise, I don't see how it could be so uniformly broken across multiple versions. On the other hand, I've attempted this with MFA REST storage, and the code for that is actually broken (in the sense that the cleaner process errors out without even contacting the REST URL), so perhaps there's just something totally wrong with MFA trusted devices in general.
My testbed uses the vanilla Apereo CAS overlay template with the below modifications, including removing cas.properties in favor of cas.yml. I have a single RegexRegisteredService with no configuration other than the name, id, and URL. I am able to login as casuser, which triggers MFA registration as expected, proceeds to prompt for the token, and then... authenticates me directly to the service. The entire time, the only occurrence of the strings 'trust' or 'Trust' in the logs are 1. CAS dumping the configured property names at startup, 2. warnings about the encryption keys being set (obviously doesn't occur with a production configuration), and 3. the MFA trusted device storage cleaner firing and not finding anything.
I'm really at the end of my rope here, and hoping someone will tell me I'm an idiot and I've missed something obvious.
Thanks for any input,
Hayden Sartoris
Additional modules in build.gradle:
dependencies {
// Other CAS dependencies/modules may be listed here...
compile "org.apereo.cas:cas-server-support-json-service-registry:${casServerVersion}"
compile "org.apereo.cas:cas-server-support-gauth:${casServerVersion}"
compile "org.apereo.cas:cas-server-support-gauth-redis:${casServerVersion}"
compile "org.apereo.cas:cas-server-support-trusted-mfa:${casServerVersion}"
}
CAS configuration:
redis:
host: redis
port: 6379
server:
port: 8443
ssl:
enabled: true
keyStore: <...>
cas:
serviceRegistry.json.location: "file:/etc/cas/services"
server:
name: https://cas02.bard.edu:8443
prefix: ${cas.server.name}/cas
authn:
mfa:
globalProviderId: mfa-gauth
gauth:
issuer: Bard
label: cas02.bard.edu
codeDigits: 6
timeStepSize: 30
trustedDeviceEnabled: true
redis:
host: ${redis.host}
port: ${redis.port}
trusted:
deviceRegistrationEnabled: true
json.location: "file:/etc/cas/config/trusted-dev.json"