diff --git a/src/Middleware/CORS/src/Infrastructure/CorsMiddleware.cs b/src/Middleware/CORS/src/Infrastructure/CorsMiddleware.cs index 91c5be905440..19aab2cc83a6 100644 --- a/src/Middleware/CORS/src/Infrastructure/CorsMiddleware.cs +++ b/src/Middleware/CORS/src/Infrastructure/CorsMiddleware.cs @@ -7,7 +7,6 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Endpoints; using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; namespace Microsoft.AspNetCore.Cors.Infrastructure { @@ -119,6 +118,9 @@ public CorsMiddleware( /// public Task Invoke(HttpContext context, ICorsPolicyProvider corsPolicyProvider) { + // Flag to indicate to other systems, that CORS middleware was run for this request + context.Items[CorsMiddlewareInvokedKey] = CorsMiddlewareInvokedValue; + if (!context.Request.Headers.ContainsKey(CorsConstants.Origin)) { return _next(context); @@ -137,9 +139,6 @@ private async Task InvokeCore(HttpContext context, ICorsPolicyProvider corsPolic // fetch policy by name, prioritizing it above policy on middleware // 3. If there is no policy on middleware then use name on middleware - // Flag to indicate to other systems, e.g. MVC, that CORS middleware was run for this request - context.Items[CorsMiddlewareInvokedKey] = CorsMiddlewareInvokedValue; - var endpoint = context.GetEndpoint(); // Get the most significant CORS metadata for the endpoint diff --git a/src/Middleware/CORS/test/UnitTests/CorsMiddlewareTests.cs b/src/Middleware/CORS/test/UnitTests/CorsMiddlewareTests.cs index 08edb4d58b53..d6ceaa8f3860 100644 --- a/src/Middleware/CORS/test/UnitTests/CorsMiddlewareTests.cs +++ b/src/Middleware/CORS/test/UnitTests/CorsMiddlewareTests.cs @@ -876,5 +876,28 @@ public async Task Invoke_InvokeFlagSet() // Assert Assert.Contains(httpContext.Items, item => string.Equals(item.Key as string, "__CorsMiddlewareInvoked")); } + + [Fact] + public async Task Invoke_WithoutOrigin_InvokeFlagSet() + { + // Arrange + var corsService = Mock.Of(); + var mockProvider = Mock.Of(); + var loggerFactory = NullLoggerFactory.Instance; + + var middleware = new CorsMiddleware( + Mock.Of(), + corsService, + loggerFactory, + "DefaultPolicyName"); + + var httpContext = new DefaultHttpContext(); + + // Act + await middleware.Invoke(httpContext, mockProvider); + + // Assert + Assert.Contains(httpContext.Items, item => string.Equals(item.Key as string, "__CorsMiddlewareInvoked")); + } } } diff --git a/src/Mvc/test/Mvc.FunctionalTests/CorsTestsBase.cs b/src/Mvc/test/Mvc.FunctionalTests/CorsTestsBase.cs index 637a427b1112..413d2247c51b 100644 --- a/src/Mvc/test/Mvc.FunctionalTests/CorsTestsBase.cs +++ b/src/Mvc/test/Mvc.FunctionalTests/CorsTestsBase.cs @@ -282,7 +282,7 @@ public async Task DisableCors_PreFlight_ActionsCanOverride_ControllerLevel(strin } [Fact] - public async Task CorsFilter_RunsBeforeOtherAuthorizationFilters_UsesPolicySpecifiedOnController() + public async Task Cors_RunsBeforeOtherAuthorizationFilters_UsesPolicySpecifiedOnController() { // Arrange var url = "http://localhost/api/store/actionusingcontrollercorssettings"; @@ -314,7 +314,7 @@ public async Task CorsFilter_RunsBeforeOtherAuthorizationFilters_UsesPolicySpeci } [Fact] - public async Task CorsFilter_RunsBeforeOtherAuthorizationFilters_UsesPolicySpecifiedOnAction() + public async Task Cors_RunsBeforeOtherAuthorizationFilters_UsesPolicySpecifiedOnAction() { // Arrange var url = "http://localhost/api/store/actionwithcorssettings"; @@ -349,7 +349,7 @@ public async Task CorsFilter_RunsBeforeOtherAuthorizationFilters_UsesPolicySpeci } [Fact] - public async Task DisableCorsFilter_RunsBeforeOtherAuthorizationFilters() + public async Task DisableCors_RunsBeforeOtherAuthorizationFilters() { // Controller enables authorization and Cors, the action has a DisableCorsAttribute. // We expect the CorsMiddleware to execute and no-op @@ -377,7 +377,7 @@ public async Task DisableCorsFilter_RunsBeforeOtherAuthorizationFilters() } [Fact] - public async Task CorsFilter_OnAction_PreferredOverController_AndAuthorizationFiltersRunAfterCors() + public async Task Cors_OnAction_PreferredOverController_AndAuthorizationFiltersRunAfterCors() { // Arrange var request = new HttpRequestMessage( @@ -398,5 +398,21 @@ public async Task CorsFilter_OnAction_PreferredOverController_AndAuthorizationFi var content = await response.Content.ReadAsStringAsync(); Assert.Empty(content); } + + [Fact] + public async Task Cors_WithoutOriginHeader_Works() + { + // Arrange + var request = new HttpRequestMessage( + HttpMethod.Put, + "http://localhost/Cors/EditUserComment?userComment=abcd"); + + // Act + var response = await Client.SendAsync(request); + + // Assert + await response.AssertStatusCodeAsync(HttpStatusCode.OK); + Assert.Empty(response.Headers); + } } }