Skip to content

Commit 590e5ae

Browse files
committed
Allows the RequestedAuthnContext Comparison attribute to be set via config
1 parent 6ffa4e4 commit 590e5ae

3 files changed

Lines changed: 42 additions & 3 deletions

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,8 @@ In addition to the required settings data (idp, sp), there is extra information
321321
// Set true or don't present thi parameter and you will get an AuthContext 'exact' 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport'
322322
// Set an array with the possible auth context values: array ('urn:oasis:names:tc:SAML:2.0:ac:classes:Password', 'urn:oasis:names:tc:SAML:2.0:ac:classes:X509'),
323323
'requestedAuthnContext': true,
324+
// Allows the authn comparison parameter to be set, defaults to 'exact' if the setting is not present.
325+
'requestedAuthnContextComparison': 'exact',
324326

325327
// In some environment you will need to set how long the published metadata of the Service Provider gonna be valid.
326328
// is possible to not set the 2 following parameters (or set to null) and default values will be set (2 days, 1 week)

src/onelogin/saml2/authn_request.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,16 @@ def __init__(self, settings, force_authn=False, is_passive=False):
7474

7575
requested_authn_context_str = ''
7676
if 'requestedAuthnContext' in security.keys() and security['requestedAuthnContext'] is not False:
77+
authn_comparison = 'exact'
78+
if 'requestedAuthnContextComparison' in security.keys():
79+
authn_comparison = security['requestedAuthnContextComparison']
80+
7781
if security['requestedAuthnContext'] is True:
78-
requested_authn_context_str = """ <samlp:RequestedAuthnContext Comparison="exact">
82+
requested_authn_context_str = """ <samlp:RequestedAuthnContext Comparison="%s">
7983
<saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
80-
</samlp:RequestedAuthnContext>"""
84+
</samlp:RequestedAuthnContext>""" % authn_comparison
8185
else:
82-
requested_authn_context_str = ' <samlp:RequestedAuthnContext Comparison="exact">'
86+
requested_authn_context_str = ' <samlp:RequestedAuthnContext Comparison="%s">' % authn_comparison
8387
for authn_context in security['requestedAuthnContext']:
8488
requested_authn_context_str += '<saml:AuthnContextClassRef>%s</saml:AuthnContextClassRef>' % authn_context
8589
requested_authn_context_str += ' </samlp:RequestedAuthnContext>'

tests/src/OneLogin/saml2_tests/authn_request_test.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,39 @@ def testCreateRequestAuthContext(self):
117117
self.assertIn(OneLogin_Saml2_Constants.AC_PASSWORD_PROTECTED, inflated)
118118
self.assertIn(OneLogin_Saml2_Constants.AC_X509, inflated)
119119

120+
def testCreateRequestAuthContextComparision(self):
121+
"""
122+
Tests the OneLogin_Saml2_Authn_Request Constructor.
123+
The creation of a deflated SAML Request with defined AuthnContextComparison
124+
"""
125+
saml_settings = self.loadSettingsJSON()
126+
settings = OneLogin_Saml2_Settings(saml_settings)
127+
authn_request = OneLogin_Saml2_Authn_Request(settings)
128+
authn_request_encoded = authn_request.get_request()
129+
decoded = b64decode(authn_request_encoded)
130+
inflated = decompress(decoded, -15)
131+
self.assertRegexpMatches(inflated, '^<samlp:AuthnRequest')
132+
self.assertIn(OneLogin_Saml2_Constants.AC_PASSWORD, inflated)
133+
self.assertNotIn(OneLogin_Saml2_Constants.AC_X509, inflated)
134+
135+
saml_settings['security']['requestedAuthnContext'] = True
136+
settings = OneLogin_Saml2_Settings(saml_settings)
137+
authn_request = OneLogin_Saml2_Authn_Request(settings)
138+
authn_request_encoded = authn_request.get_request()
139+
decoded = b64decode(authn_request_encoded)
140+
inflated = decompress(decoded, -15)
141+
self.assertRegexpMatches(inflated, '^<samlp:AuthnRequest')
142+
self.assertIn('RequestedAuthnContext Comparison="exact"', inflated)
143+
144+
saml_settings['security']['requestedAuthnContextComparison'] = 'minimun'
145+
settings = OneLogin_Saml2_Settings(saml_settings)
146+
authn_request = OneLogin_Saml2_Authn_Request(settings)
147+
authn_request_encoded = authn_request.get_request()
148+
decoded = b64decode(authn_request_encoded)
149+
inflated = decompress(decoded, -15)
150+
self.assertRegexpMatches(inflated, '^<samlp:AuthnRequest')
151+
self.assertIn('RequestedAuthnContext Comparison="minimun"', inflated)
152+
120153
def testCreateRequestForceAuthN(self):
121154
"""
122155
Tests the OneLogin_Saml2_Authn_Request Constructor.

0 commit comments

Comments
 (0)