The inability to map ACRs is severely limiting to Keycloak as an IDP. Also the reliance on LOA as singular numeric calculations for access.
ACR should be more than just a single signal, it can be a collection of signals to meet a higher level condition. For example:
urn:gov:acr:public = Any Network, Any Device, Any MFA
urn:gov:acr:mod = Trusted Network, Compliant Device, Phishing-resistant MFA
urn:gov:acr:high.itar = Trust Network, Compliant Device, Government Issued Smartcard Only
AMR carries the specifics on what signals met the condition. Such as in the case of high.itar might have:
{
ācredentialā: {
ātypeā: ācertificateā,
ācategoryā: āhardwareā,
āissuerā: āgovIssuingCAā,
āissuer-thumbprintā: āsomethumbrint:stuff:hereā
},
ānetworkā: ātrustedā,
ādeviceā: ācompliantā
}
I donāt care about the details, and if the organization changes the top level rules thereās nothing to change (such as now allowing non-compliant but registered devices or additional credential types); the changes would solely take place at the authorization server minting the tokens.
And at the IDP side, I can go down the list of conditions to make the most logical user-friendly step-up behavior (such as if you already logged in with smartcard, but not on a compliant device then I simply say āThis requires logging in from a registered compliant device, go hereā). The App/API only cares that if I get āurn:gov:acr:publicā itās good for all public data and urn:gov:acr:high.itar is valid for ITAR data; and if the condition doesnāt meet the data tags then issue a new log in request with the right ACR.
So while the client/API may be involved, and should be, thereās still also going to be needs to overwrite/modify when sending to external IDPs or enforce specific ACR for any given client if they canāt specifically request one.
Edit: Hereās just one smaller example of translating ACRs across providers. For US Consumer to Government then Login.gov is supposed to be used. They have various ACRs that have to be converted from a common one that may already exist and are unknown to each app in the federation that agrees to other values/conditions.
Such as if I know the log in from Client ā MyIDP requires an Identity proofed account, from a compliant device workstation, then the Identity Proofing (IAL) requirements only has to be conveyed across with urn:acr.login.gov:verified-facial-match-required.
Client ā sends acr_values urn:gov:mod ā MyIDP ā sends acr_values urn:acr.login.gov:verified-facial-match-required ā Login.gov in order to get the right condition for that singular signal to ensure the Identity was proofed (they do not own the device nor can give me a device compliance check).
Then combine that with my own device compliant validation, to ultimately return and urn:gov:mod as the final āACRā to anyone participating in our āfederation agreementā.