authentik.enterprise.providers.ws_federation.tests.test_sign_in

 1import xmlsec
 2from django.test import TestCase
 3from guardian.utils import get_anonymous_user
 4from lxml import etree  # nosec
 5
 6from authentik.core.models import Application
 7from authentik.core.tests.utils import RequestFactory, create_test_cert, create_test_flow
 8from authentik.enterprise.providers.ws_federation.models import WSFederationProvider
 9from authentik.enterprise.providers.ws_federation.processors.constants import (
10    NS_MAP,
11    WS_FED_ACTION_SIGN_IN,
12    WS_FED_POST_KEY_RESULT,
13)
14from authentik.enterprise.providers.ws_federation.processors.sign_in import (
15    SignInProcessor,
16    SignInRequest,
17)
18from authentik.lib.generators import generate_id
19from authentik.lib.xml import lxml_from_string
20
21
22class TestWSFedSignIn(TestCase):
23    def setUp(self):
24        self.flow = create_test_flow()
25        self.cert = create_test_cert()
26        self.provider = WSFederationProvider.objects.create(
27            name=generate_id(),
28            authorization_flow=self.flow,
29            signing_kp=self.cert,
30        )
31        self.app = Application.objects.create(
32            name=generate_id(), slug=generate_id(), provider=self.provider
33        )
34        self.factory = RequestFactory()
35
36    def test_token_gen(self):
37        request = self.factory.get("/", user=get_anonymous_user())
38        proc = SignInProcessor(
39            self.provider,
40            request,
41            SignInRequest(
42                wa=WS_FED_ACTION_SIGN_IN,
43                wtrealm="",
44                wreply="",
45                wctx=None,
46            ),
47        )
48        token = proc.response()[WS_FED_POST_KEY_RESULT]
49
50        root = lxml_from_string(token)
51
52        schema = etree.XMLSchema(
53            etree.parse(source="schemas/ws-trust.xsd", parser=etree.XMLParser())  # nosec
54        )
55        self.assertTrue(schema.validate(etree=root), schema.error_log)
56
57    def test_signature(self):
58        request = self.factory.get("/", user=get_anonymous_user())
59        proc = SignInProcessor(
60            self.provider,
61            request,
62            SignInRequest(
63                wa=WS_FED_ACTION_SIGN_IN,
64                wtrealm="",
65                wreply="",
66                wctx=None,
67            ),
68        )
69        token = proc.response()[WS_FED_POST_KEY_RESULT]
70
71        root = lxml_from_string(token)
72        xmlsec.tree.add_ids(root, ["ID"])
73        signature_nodes = root.xpath("//saml:Assertion/ds:Signature", namespaces=NS_MAP)
74        self.assertEqual(len(signature_nodes), 1)
75
76        signature_node = signature_nodes[0]
77        ctx = xmlsec.SignatureContext()
78        ctx.key = xmlsec.Key.from_memory(
79            self.cert.certificate_data,
80            xmlsec.constants.KeyDataFormatCertPem,
81            None,
82        )
83        ctx.verify(signature_node)
class TestWSFedSignIn(django.test.testcases.TestCase):
23class TestWSFedSignIn(TestCase):
24    def setUp(self):
25        self.flow = create_test_flow()
26        self.cert = create_test_cert()
27        self.provider = WSFederationProvider.objects.create(
28            name=generate_id(),
29            authorization_flow=self.flow,
30            signing_kp=self.cert,
31        )
32        self.app = Application.objects.create(
33            name=generate_id(), slug=generate_id(), provider=self.provider
34        )
35        self.factory = RequestFactory()
36
37    def test_token_gen(self):
38        request = self.factory.get("/", user=get_anonymous_user())
39        proc = SignInProcessor(
40            self.provider,
41            request,
42            SignInRequest(
43                wa=WS_FED_ACTION_SIGN_IN,
44                wtrealm="",
45                wreply="",
46                wctx=None,
47            ),
48        )
49        token = proc.response()[WS_FED_POST_KEY_RESULT]
50
51        root = lxml_from_string(token)
52
53        schema = etree.XMLSchema(
54            etree.parse(source="schemas/ws-trust.xsd", parser=etree.XMLParser())  # nosec
55        )
56        self.assertTrue(schema.validate(etree=root), schema.error_log)
57
58    def test_signature(self):
59        request = self.factory.get("/", user=get_anonymous_user())
60        proc = SignInProcessor(
61            self.provider,
62            request,
63            SignInRequest(
64                wa=WS_FED_ACTION_SIGN_IN,
65                wtrealm="",
66                wreply="",
67                wctx=None,
68            ),
69        )
70        token = proc.response()[WS_FED_POST_KEY_RESULT]
71
72        root = lxml_from_string(token)
73        xmlsec.tree.add_ids(root, ["ID"])
74        signature_nodes = root.xpath("//saml:Assertion/ds:Signature", namespaces=NS_MAP)
75        self.assertEqual(len(signature_nodes), 1)
76
77        signature_node = signature_nodes[0]
78        ctx = xmlsec.SignatureContext()
79        ctx.key = xmlsec.Key.from_memory(
80            self.cert.certificate_data,
81            xmlsec.constants.KeyDataFormatCertPem,
82            None,
83        )
84        ctx.verify(signature_node)

Similar to TransactionTestCase, but use transaction.atomic() to achieve test isolation.

In most situations, TestCase should be preferred to TransactionTestCase as it allows faster execution. However, there are some situations where using TransactionTestCase might be necessary (e.g. testing some transactional behavior).

On database backends with no transaction support, TestCase behaves as TransactionTestCase.

def setUp(self):
24    def setUp(self):
25        self.flow = create_test_flow()
26        self.cert = create_test_cert()
27        self.provider = WSFederationProvider.objects.create(
28            name=generate_id(),
29            authorization_flow=self.flow,
30            signing_kp=self.cert,
31        )
32        self.app = Application.objects.create(
33            name=generate_id(), slug=generate_id(), provider=self.provider
34        )
35        self.factory = RequestFactory()

Hook method for setting up the test fixture before exercising it.

def test_token_gen(self):
37    def test_token_gen(self):
38        request = self.factory.get("/", user=get_anonymous_user())
39        proc = SignInProcessor(
40            self.provider,
41            request,
42            SignInRequest(
43                wa=WS_FED_ACTION_SIGN_IN,
44                wtrealm="",
45                wreply="",
46                wctx=None,
47            ),
48        )
49        token = proc.response()[WS_FED_POST_KEY_RESULT]
50
51        root = lxml_from_string(token)
52
53        schema = etree.XMLSchema(
54            etree.parse(source="schemas/ws-trust.xsd", parser=etree.XMLParser())  # nosec
55        )
56        self.assertTrue(schema.validate(etree=root), schema.error_log)
def test_signature(self):
58    def test_signature(self):
59        request = self.factory.get("/", user=get_anonymous_user())
60        proc = SignInProcessor(
61            self.provider,
62            request,
63            SignInRequest(
64                wa=WS_FED_ACTION_SIGN_IN,
65                wtrealm="",
66                wreply="",
67                wctx=None,
68            ),
69        )
70        token = proc.response()[WS_FED_POST_KEY_RESULT]
71
72        root = lxml_from_string(token)
73        xmlsec.tree.add_ids(root, ["ID"])
74        signature_nodes = root.xpath("//saml:Assertion/ds:Signature", namespaces=NS_MAP)
75        self.assertEqual(len(signature_nodes), 1)
76
77        signature_node = signature_nodes[0]
78        ctx = xmlsec.SignatureContext()
79        ctx.key = xmlsec.Key.from_memory(
80            self.cert.certificate_data,
81            xmlsec.constants.KeyDataFormatCertPem,
82            None,
83        )
84        ctx.verify(signature_node)