Skip to content

Commit 0705917

Browse files
committed
Adding AuthnContextClassRef support #34
1 parent df53d19 commit 0705917

File tree

4 files changed

+37
-2
lines changed

4 files changed

+37
-2
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,10 +212,12 @@ This is the settings.json file:
212212
// represent the requested subject.
213213
// Take a look on src/onelogin/saml2/constants.py to see the NameIdFormat that are supported.
214214
"NameIDFormat": "urn:oasis:names:tc:SAML:2.0:nameid-format:unspecified",
215+
// Specifies the AuthnContextClassRef that will be sent in the login request
216+
'AuthnContextClassRef' => 'urn:oasis:names:tc:SAML:2.0:ac:classes:Password',
215217
// Usually x509cert and privateKey of the SP are provided by files placed at
216218
// the certs folder. But we can also provide them with the following parameters
217219
'x509cert' => '',
218-
'privateKey' > ''
220+
'privateKey' => ''
219221
},
220222

221223
// Identity Provider Data that we want connected with our SP.

src/onelogin/saml2/authn_request.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ def __init__(self, settings):
5858
if 'displayname' in organization_data[lang] and organization_data[lang]['displayname'] is not None:
5959
provider_name_str = 'ProviderName="%s"' % organization_data[lang]['displayname']
6060

61+
auth_context_class_ref = sp_data['AuthnContextClassRef']
62+
6163
request = """<samlp:AuthnRequest
6264
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
6365
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
@@ -73,7 +75,7 @@ def __init__(self, settings):
7375
Format="%(name_id_policy)s"
7476
AllowCreate="true" />
7577
<samlp:RequestedAuthnContext Comparison="exact">
76-
<saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
78+
<saml:AuthnContextClassRef>%(auth_context_class_ref)s</saml:AuthnContextClassRef>
7779
</samlp:RequestedAuthnContext>
7880
</samlp:AuthnRequest>""" % \
7981
{
@@ -84,6 +86,7 @@ def __init__(self, settings):
8486
'assertion_url': sp_data['assertionConsumerService']['url'],
8587
'entity_id': sp_data['entityId'],
8688
'name_id_policy': name_id_policy_format,
89+
'auth_context_class_ref': auth_context_class_ref,
8790
}
8891

8992
self.__authn_request = request

src/onelogin/saml2/settings.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,10 @@ def __add_default_values(self):
266266
if 'nameIdEncrypted' not in self.__security:
267267
self.__security['nameIdEncrypted'] = False
268268

269+
# AuthnContextClassRef
270+
if 'AuthnContextClassRef' not in self.__sp:
271+
self.__sp['AuthnContextClassRef'] = OneLogin_Saml2_Constants.AC_PASSWORD
272+
269273
# Sign provided
270274
if 'authnRequestsSigned' not in self.__security.keys():
271275
self.__security['authnRequestsSigned'] = False

tests/src/OneLogin/saml2_tests/authn_request_test.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from zlib import decompress
1212

1313
from onelogin.saml2.authn_request import OneLogin_Saml2_Authn_Request
14+
from onelogin.saml2.constants import OneLogin_Saml2_Constants
1415
from onelogin.saml2.settings import OneLogin_Saml2_Settings
1516
from onelogin.saml2.utils import OneLogin_Saml2_Utils
1617

@@ -61,6 +62,31 @@ def testCreateRequest(self):
6162
self.assertRegexpMatches(inflated, '^<samlp:AuthnRequest')
6263
self.assertNotIn('ProviderName="SP test"', inflated)
6364

65+
def testCreateRequestAuthContext(self):
66+
"""
67+
Tests the OneLogin_Saml2_Authn_Request Constructor.
68+
The creation of a deflated SAML Request with defined AuthContext
69+
"""
70+
saml_settings = self.loadSettingsJSON()
71+
settings = OneLogin_Saml2_Settings(saml_settings)
72+
authn_request = OneLogin_Saml2_Authn_Request(settings)
73+
authn_request_encoded = authn_request.get_request()
74+
decoded = b64decode(authn_request_encoded)
75+
inflated = decompress(decoded, -15)
76+
self.assertRegexpMatches(inflated, '^<samlp:AuthnRequest')
77+
self.assertIn(OneLogin_Saml2_Constants.AC_PASSWORD, inflated)
78+
self.assertNotIn(OneLogin_Saml2_Constants.AC_X509, inflated)
79+
80+
saml_settings['sp']['AuthnContextClassRef'] = OneLogin_Saml2_Constants.AC_X509
81+
settings = OneLogin_Saml2_Settings(saml_settings)
82+
authn_request = OneLogin_Saml2_Authn_Request(settings)
83+
authn_request_encoded = authn_request.get_request()
84+
decoded = b64decode(authn_request_encoded)
85+
inflated = decompress(decoded, -15)
86+
self.assertRegexpMatches(inflated, '^<samlp:AuthnRequest')
87+
self.assertNotIn(OneLogin_Saml2_Constants.AC_PASSWORD, inflated)
88+
self.assertIn(OneLogin_Saml2_Constants.AC_X509, inflated)
89+
6490
def testCreateDeflatedSAMLRequestURLParameter(self):
6591
"""
6692
Tests the OneLogin_Saml2_Authn_Request Constructor.

0 commit comments

Comments
 (0)