diff --git a/modules/saml/src/Controller/Metadata.php b/modules/saml/src/Controller/Metadata.php
index 97f4d8780e9c72e9cdefb2f81c22d33e25d6b70e..ceae302e0b03426172cad2a5721ed915d155b9df 100644
--- a/modules/saml/src/Controller/Metadata.php
+++ b/modules/saml/src/Controller/Metadata.php
@@ -106,6 +106,11 @@ class Metadata
             $metaxml = substr($metaxml, 0, $i ? $i + 22 : 0);
 
             $response = new Response();
+            $response->setEtag(hash('sha256', $metaxml));
+            $response->setPublic();
+            if ($response->isNotModified($request)) {
+                return $response;
+            }
             $response->headers->set('Content-Type', 'application/samlmetadata+xml');
             $response->headers->set('Content-Disposition', 'attachment; filename="idp-metadata.xml"');
             $response->setContent($metaxml);
diff --git a/modules/saml/src/Controller/ServiceProvider.php b/modules/saml/src/Controller/ServiceProvider.php
index b7fd835800db67094fdfd230834a590acf14293e..bd5d579fd4673b103b5b128586286ead804b449e 100644
--- a/modules/saml/src/Controller/ServiceProvider.php
+++ b/modules/saml/src/Controller/ServiceProvider.php
@@ -607,6 +607,11 @@ class ServiceProvider
         $metaxml = substr($metaxml, 0, $i ? $i + 22 : 0);
 
         $response = new Response();
+        $response->setEtag(hash('sha256', $metaxml));
+        $response->setPublic();
+        if ($response->isNotModified($request)) {
+            return $response;
+        }
         $response->headers->set('Content-Type', 'application/samlmetadata+xml');
         $response->headers->set('Content-Disposition', 'attachment; filename="' . basename($sourceId) . '.xml"');
         $response->setContent($metaxml);