A cloud-based identity and access management service for securing user authentication and resource access
I was able to get Entra ID to return a usable MFA indicator without any special configuration in Entra, using a hint from this Microsoft doc (not obvious from the main SAML protocol docs):
Key takeaway: if you need Entra to return http://schemas.microsoft.com/claims/multipleauthn as the AuthnContextClassRef, you must request it via RequestedAuthnContext, and it must be the first item in the list.
In my testing, if a custom/unknown AuthnContextClassRef appears before multipleauthn, Entra rejects the AuthnRequest immediately (instead of evaluating subsequent entries). So ordering matters.
Example AuthnRequest excerpt (works)
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
https://mydomain.com/myid
</saml:Issuer>
<samlp:NameIDPolicy AllowCreate="1" />
<samlp:RequestedAuthnContext Comparison="exact">
<!-- MUST BE FIRST -->
<saml:AuthnContextClassRef xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
http://schemas.microsoft.com/claims/multipleauthn
</saml:AuthnContextClassRef>
<!-- Additional values (including custom ones) can follow -->
<saml:AuthnContextClassRef xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
urn:pingidentity:pingone:authn:web_login_otp
</saml:AuthnContextClassRef>
<saml:AuthnContextClassRef xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
urn:pingidentity:pingone:authn:web_login_fido
</saml:AuthnContextClassRef>
<saml:AuthnContextClassRef xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
urn:pingidentity:pingone:authn:web_login_email
</saml:AuthnContextClassRef>
<saml:AuthnContextClassRef xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI
</saml:AuthnContextClassRef>
<saml:AuthnContextClassRef xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
https://refeds.org/profile/mfa
</saml:AuthnContextClassRef>
</samlp:RequestedAuthnContext>
What Entra returns (important bits)
With the request above, Entra returned:
AuthnStatement/AuthnContextClassRef = http://schemas.microsoft.com/claims/multipleauthn
and also included the authnmethodsreferences attribute showing the methods used, e.g.:
<Attribute Name="http://schemas.microsoft.com/claims/authnmethodsreferences">
<AttributeValue>
http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password
</AttributeValue>
<AttributeValue>
http://schemas.microsoft.com/claims/multipleauthn
</AttributeValue>
</Attribute>
<AuthnStatement ...>
<AuthnContext>
<AuthnContextClassRef>
http://schemas.microsoft.com/claims/multipleauthn
</AuthnContextClassRef>
</AuthnContext>
</AuthnStatement>
Example Shibboleth SP Apache config
AuthType shibboleth
ShibRequestSetting requireSession On
ShibRequestSetting redirectToSSL 443
ShibRequestSetting REMOTE_ADDR X-Forwarded-For
ShibRequestSetting forceAuthn On
ShibUseEnvironment On
<RequireAll>
ShibRequestSetting authnContextClassRef "\
http://schemas.microsoft.com/claims/multipleauthn \
urn:pingidentity:pingone:authn:web_login_otp \
urn:pingidentity:pingone:authn:web_login_fido \
urn:pingidentity:pingone:authn:web_login_email \
urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI \
https://refeds.org/profile/mfa"
ShibRequestSetting authnContextComparison exact
Require shib-session
# Explicitly deny "unspecified"
<RequireNone>
Require authnContextClassRef urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified
</RequireNone>
# Allow any of the above
<RequireAny>
Require authnContextClassRef "http://schemas.microsoft.com/claims/multipleauthn"
Require authnContextClassRef "urn:pingidentity:pingone:authn:web_login_otp"
Require authnContextClassRef "urn:pingidentity:pingone:authn:web_login_fido"
Require authnContextClassRef "urn:pingidentity:pingone:authn:web_login_email"
Require authnContextClassRef "urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI"
Require authnContextClassRef "https://refeds.org/profile/mfa"
</RequireAny>
</RequireAll>
Bottom line: If your SP/app needs Entra to emit a strong auth signal, requesting http://schemas.microsoft.com/claims/multipleauthn (and putting it first) can cause Entra to return it directly in AuthnContextClassRef, plus the authnmethodsreferences attribute values. This worked for me with Shibboleth SP without making any changes in Entra itself.