diff --git a/src/Models/CrossOriginEmbedderPolicy.cs b/src/Models/CrossOriginEmbedderPolicy.cs
index 0d2d15d..9124876 100644
--- a/src/Models/CrossOriginEmbedderPolicy.cs
+++ b/src/Models/CrossOriginEmbedderPolicy.cs
@@ -70,4 +70,28 @@ public string BuildHeaderValue()
return RequireCorp;
}
}
+
+ ///
+ /// Used to calculate whether the current header value is valid
+ ///
+ ///
+ /// Whether the CORP header is included in the outer setup
+ ///
+ ///
+ /// The value for this header is only invalid if the CORP (Cross-Origin-Resource-Policy) header
+ /// is enabled and the current value for the COEP (Cross-Origin-Embedder-Policy) hedaer is set to
+ ///
+ ///
+ public bool HeaderValueIsValid(bool useCrossOriginResourcePolicy)
+ {
+ if (OptionValue == CrossOriginEmbedderOptions.RequireCorp)
+ {
+ if (!useCrossOriginResourcePolicy)
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
}
diff --git a/src/SecureHeadersMiddleware.cs b/src/SecureHeadersMiddleware.cs
index 48641d8..22e9af0 100644
--- a/src/SecureHeadersMiddleware.cs
+++ b/src/SecureHeadersMiddleware.cs
@@ -134,7 +134,7 @@ private FrozenDictionary GenerateRelevantHeaders()
if (_config.UseCrossOriginEmbedderPolicy)
{
- if (!_config.UseCrossOriginResourcePolicy)
+ if (!_config.CrossOriginEmbedderPolicy.HeaderValueIsValid(_config.UseCrossOriginResourcePolicy))
{
BoolValueGuardClauses.MustBeTrue(_config.UseCrossOriginResourcePolicy, nameof(_config.UseCrossOriginResourcePolicy));
}
diff --git a/tests/OwaspHeaders.Core.Tests/CustomHeaders/CrossOriginOptionsTests.cs b/tests/OwaspHeaders.Core.Tests/CustomHeaders/CrossOriginOptionsTests.cs
index 3d6d484..5a13574 100644
--- a/tests/OwaspHeaders.Core.Tests/CustomHeaders/CrossOriginOptionsTests.cs
+++ b/tests/OwaspHeaders.Core.Tests/CustomHeaders/CrossOriginOptionsTests.cs
@@ -135,5 +135,36 @@ public async Task When_UseCrossOriginEmbedderPolicyNotCalled_Header_Not_Present(
Assert.False(headerNotPresentConfig.UseCrossOriginEmbedderPolicy);
Assert.False(_context.Response.Headers.ContainsKey(Constants.CrossOriginEmbedderPolicyHeaderName));
}
+
+ [Theory]
+ [InlineData(CrossOriginEmbedderPolicy.CrossOriginEmbedderOptions.RequireCorp)]
+ [InlineData(CrossOriginEmbedderPolicy.CrossOriginEmbedderOptions.UnsafeNone)]
+ public void CrossOriginEmbedderPolicy_HeaderValueIsValid_Returns_True_When_HeaderIsValid(CrossOriginEmbedderPolicy.CrossOriginEmbedderOptions headerValue)
+ {
+ // Arrange
+ var header = new CrossOriginEmbedderPolicy(headerValue);
+ const bool useCorp = true;
+
+ // Act
+ var valid = header.HeaderValueIsValid(useCorp);
+
+ // Assert
+ Assert.True(valid);
+ }
+
+ [Fact]
+ public void CrossOriginEmbedderPolicy_HeaderValueIsValid_Returns_False_When_HeaderIsInvalid()
+ {
+ // Arrange
+ var header = new CrossOriginEmbedderPolicy(CrossOriginEmbedderPolicy.CrossOriginEmbedderOptions.RequireCorp);
+ var useCorp = false;
+
+ // Act
+ var valid = header.HeaderValueIsValid(useCorp);
+
+ // Assert
+ Assert.False(valid);
+ }
+
}