Skip to content

Commit f4a7def

Browse files
Set CorsResult.VaryByOrigin if CorsPolicy has non-default IsOriginAllowed function (#25265)
Fixes #21988.
1 parent 1268b6e commit f4a7def

File tree

4 files changed

+52
-4
lines changed

4 files changed

+52
-4
lines changed

src/Middleware/CORS/src/Infrastructure/CorsPolicy.cs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@ namespace Microsoft.AspNetCore.Cors.Infrastructure
1313
/// </summary>
1414
public class CorsPolicy
1515
{
16+
private Func<string, bool> _isOriginAllowed;
1617
private TimeSpan? _preflightMaxAge;
1718

1819
/// <summary>
1920
/// Default constructor for a CorsPolicy.
2021
/// </summary>
2122
public CorsPolicy()
2223
{
23-
IsOriginAllowed = DefaultIsOriginAllowed;
24+
_isOriginAllowed = DefaultIsOriginAllowed;
2425
}
2526

2627
/// <summary>
@@ -71,10 +72,26 @@ public bool AllowAnyOrigin
7172
}
7273
}
7374

75+
/// <summary>
76+
/// Gets a value indicating if <see cref="IsOriginAllowed"/> is the default function that is set in the CorsPolicy constructor.
77+
/// </summary>
78+
internal bool IsDefaultIsOriginAllowed { get; private set; } = true;
79+
7480
/// <summary>
7581
/// Gets or sets a function which evaluates whether an origin is allowed.
7682
/// </summary>
77-
public Func<string, bool> IsOriginAllowed { get; set; }
83+
public Func<string, bool> IsOriginAllowed
84+
{
85+
get
86+
{
87+
return _isOriginAllowed;
88+
}
89+
set
90+
{
91+
_isOriginAllowed = value;
92+
IsDefaultIsOriginAllowed = false;
93+
}
94+
}
7895

7996
/// <summary>
8097
/// Gets the headers that the resource might use and can be exposed.

src/Middleware/CORS/src/Infrastructure/CorsService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ private static void PopulateResult(HttpContext context, CorsPolicy policy, CorsR
119119
{
120120
var origin = headers[CorsConstants.Origin];
121121
result.AllowedOrigin = origin;
122-
result.VaryByOrigin = policy.Origins.Count > 1;
122+
result.VaryByOrigin = policy.Origins.Count > 1 || !policy.IsDefaultIsOriginAllowed;
123123
}
124124

125125
result.SupportsCredentials = policy.SupportsCredentials;

src/Middleware/CORS/test/UnitTests/CorsPolicyTests.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,20 @@ public void Default_Constructor()
2525
Assert.Empty(corsPolicy.Origins);
2626
Assert.Null(corsPolicy.PreflightMaxAge);
2727
Assert.NotNull(corsPolicy.IsOriginAllowed);
28+
Assert.True(corsPolicy.IsDefaultIsOriginAllowed);
29+
}
30+
31+
[Fact]
32+
public void IsDefaultIsOriginAllowed_IsFalseAfterSettingIsOriginAllowed()
33+
{
34+
// Arrange
35+
var policy = new CorsPolicy();
36+
37+
// Act
38+
policy.IsOriginAllowed = origin => true;
39+
40+
// Assert
41+
Assert.False(policy.IsDefaultIsOriginAllowed);
2842
}
2943

3044
[Fact]
@@ -71,4 +85,4 @@ public void ToString_ReturnsThePropertyValues()
7185
policyString);
7286
}
7387
}
74-
}
88+
}

src/Middleware/CORS/test/UnitTests/CorsServiceTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,23 @@ public void EvaluatePolicy_AllowMultipleOrigins_VariesByOrigin()
223223
Assert.True(result.VaryByOrigin);
224224
}
225225

226+
[Fact]
227+
public void EvaluatePolicy_SetIsOriginAllowed_VariesByOrigin()
228+
{
229+
// Arrange
230+
var corsService = GetCorsService();
231+
var requestContext = GetHttpContext(origin: "http://example.com");
232+
var policy = new CorsPolicy();
233+
policy.IsOriginAllowed = origin => true;
234+
235+
// Act
236+
var result = corsService.EvaluatePolicy(requestContext, policy);
237+
238+
// Assert
239+
Assert.Equal("http://example.com", result.AllowedOrigin);
240+
Assert.True(result.VaryByOrigin);
241+
}
242+
226243
[Fact]
227244
public void EvaluatePolicy_NoExposedHeaders_NoAllowExposedHeaders()
228245
{

0 commit comments

Comments
 (0)