From ae2d82c748a341bcd9a3434b7de28c9b76c31c7b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 2 Mar 2018 12:25:53 -0800 Subject: [PATCH] Remove FiltersWebSite --- Mvc.sln | 13 - .../BasicTests.cs | 18 - .../FiltersTest.cs | 551 ++---------------- .../HttpResponseMessageExceptions.cs | 48 -- ...soft.AspNetCore.Mvc.FunctionalTests.csproj | 1 - .../BasicAuthenticationHandler.cs | 19 +- .../WebSites/BasicWebSite/BasicWebSite.csproj | 2 + .../BasicWebSite/ConfigureAuthPolicies.cs | 34 ++ .../Controllers/AuthorizeUserController.cs | 20 +- .../Controllers/FiltersController.cs | 19 +- .../Filters/ServiceActionFilter.cs | 29 + .../Filters/TraceOutputResultFilter.cs} | 14 +- .../Filters/TraceResourceFilter.cs | 21 + .../LocalizationPipeline.cs | 4 +- .../ManagerHandler.cs | 2 +- .../Operations.cs | 4 +- test/WebSites/BasicWebSite/Startup.cs | 19 +- .../BasicWebSite/StartupRequestLimitSize.cs | 1 + ...hCookieTempDataProviderAndCookieConsent.cs | 2 + .../StartupWithSessionTempDataProvider.cs | 2 + test/WebSites/FiltersWebSite/BasicOptions.cs | 16 - .../Controllers/ActionFilterController.cs | 55 -- .../Controllers/AnonymousController.cs | 16 - .../Controllers/DummyClassController.cs | 46 -- .../Controllers/ExceptionController.cs | 16 - .../Controllers/ExceptionOrderController.cs | 18 - .../Controllers/HomeController.cs | 86 --- .../MiddlewareFilterTestController.cs | 18 - .../Controllers/ProductsController.cs | 50 -- .../Controllers/RandomNumberController.cs | 50 -- .../Controllers/ResourceFilterController.cs | 84 --- .../Controllers/ResultFilterController.cs | 27 - .../Controllers/XmlSerializerController.cs | 16 - .../FiltersWebSite/ErrorReporterMiddleware.cs | 50 -- .../Filters/AddHeaderAttribute.cs | 18 - .../Filters/AuthorizeUserAttribute.cs | 34 -- .../FiltersWebSite/Filters/BlockAnonymous.cs | 42 -- .../Filters/ChangeContentActionFilter.cs | 30 - .../Filters/ChangeContentResultFilter.cs | 15 - .../Filters/ControllerActionFilter.cs | 48 -- .../Filters/ControllerAuthorizationFilter.cs | 16 - .../Filters/ControllerExceptionFilter.cs | 19 - .../Filters/ControllerResultFilter.cs | 39 -- .../DisableFormValueModelBindingAttribute.cs | 38 -- .../Filters/GlobalActionFilter.cs | 50 -- .../Filters/GlobalAuthorizationFilter.cs | 25 - .../Filters/GlobalExceptionFilter.cs | 15 - .../Filters/GlobalResultFilter.cs | 41 -- .../Filters/HandleExceptionActionFilter.cs | 20 - .../HandleInvalidOperationExceptionFilter.cs | 19 - .../Filters/ModifiedRandomNumberProvider.cs | 26 - .../Filters/ModifyResultsFilterAttribute.cs | 23 - .../Filters/PassThroughActionFilter.cs | 21 - .../Filters/PassThroughResultFilter.cs | 35 -- .../Filters/RandomNumberFilter.cs | 25 - .../Filters/RandomNumberModifier.cs | 27 - .../Filters/RandomNumberProvider.cs | 26 - .../SerializationActionFilterAttribute.cs | 23 - .../Filters/ShortCircuitActionFilter.cs | 21 - .../Filters/ShortCircuitExceptionFilter.cs | 15 - .../Filters/TestResourceFilter.cs | 95 --- .../Filters/ThrowingActionFilter.cs | 16 - .../Filters/ThrowingAuthorizationFilter.cs | 16 - .../Filters/ThrowingExceptionFilter.cs | 16 - .../Filters/ThrowingResultFilter.cs | 16 - .../Filters/TracingResourceFilter.cs | 36 -- .../FiltersWebSite/FiltersWebSite.csproj | 17 - .../WebSites/FiltersWebSite/Helper/Helpers.cs | 28 - .../FiltersWebSite/Models/DummyClass.cs | 10 - .../FiltersWebSite/Services/DummyService.cs | 16 - .../Services/RandomNumberService.cs | 13 - test/WebSites/FiltersWebSite/Startup.cs | 82 --- test/WebSites/FiltersWebSite/readme.md | 5 - 73 files changed, 205 insertions(+), 2243 deletions(-) delete mode 100644 test/Microsoft.AspNetCore.Mvc.FunctionalTests/HttpResponseMessageExceptions.cs rename test/WebSites/{FiltersWebSite => BasicWebSite}/BasicAuthenticationHandler.cs (73%) create mode 100644 test/WebSites/BasicWebSite/ConfigureAuthPolicies.cs rename test/WebSites/{FiltersWebSite => BasicWebSite}/Controllers/AuthorizeUserController.cs (65%) create mode 100644 test/WebSites/BasicWebSite/Filters/ServiceActionFilter.cs rename test/WebSites/{FiltersWebSite/Filters/ShortCircuitResultFilter.cs => BasicWebSite/Filters/TraceOutputResultFilter.cs} (54%) create mode 100644 test/WebSites/BasicWebSite/Filters/TraceResourceFilter.cs rename test/WebSites/{FiltersWebSite => BasicWebSite}/LocalizationPipeline.cs (92%) rename test/WebSites/{FiltersWebSite => BasicWebSite}/ManagerHandler.cs (97%) rename test/WebSites/{FiltersWebSite => BasicWebSite}/Operations.cs (59%) delete mode 100644 test/WebSites/FiltersWebSite/BasicOptions.cs delete mode 100644 test/WebSites/FiltersWebSite/Controllers/ActionFilterController.cs delete mode 100644 test/WebSites/FiltersWebSite/Controllers/AnonymousController.cs delete mode 100644 test/WebSites/FiltersWebSite/Controllers/DummyClassController.cs delete mode 100644 test/WebSites/FiltersWebSite/Controllers/ExceptionController.cs delete mode 100644 test/WebSites/FiltersWebSite/Controllers/ExceptionOrderController.cs delete mode 100644 test/WebSites/FiltersWebSite/Controllers/HomeController.cs delete mode 100644 test/WebSites/FiltersWebSite/Controllers/MiddlewareFilterTestController.cs delete mode 100644 test/WebSites/FiltersWebSite/Controllers/ProductsController.cs delete mode 100644 test/WebSites/FiltersWebSite/Controllers/RandomNumberController.cs delete mode 100644 test/WebSites/FiltersWebSite/Controllers/ResourceFilterController.cs delete mode 100644 test/WebSites/FiltersWebSite/Controllers/ResultFilterController.cs delete mode 100644 test/WebSites/FiltersWebSite/Controllers/XmlSerializerController.cs delete mode 100644 test/WebSites/FiltersWebSite/ErrorReporterMiddleware.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/AddHeaderAttribute.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/AuthorizeUserAttribute.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/BlockAnonymous.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ChangeContentActionFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ChangeContentResultFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ControllerActionFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ControllerAuthorizationFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ControllerExceptionFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ControllerResultFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/DisableFormValueModelBindingAttribute.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/GlobalActionFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/GlobalAuthorizationFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/GlobalExceptionFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/GlobalResultFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/HandleExceptionActionFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/HandleInvalidOperationExceptionFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ModifiedRandomNumberProvider.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ModifyResultsFilterAttribute.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/PassThroughActionFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/PassThroughResultFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/RandomNumberFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/RandomNumberModifier.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/RandomNumberProvider.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/SerializationActionFilterAttribute.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ShortCircuitActionFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ShortCircuitExceptionFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/TestResourceFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ThrowingActionFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ThrowingAuthorizationFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ThrowingExceptionFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/ThrowingResultFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/Filters/TracingResourceFilter.cs delete mode 100644 test/WebSites/FiltersWebSite/FiltersWebSite.csproj delete mode 100644 test/WebSites/FiltersWebSite/Helper/Helpers.cs delete mode 100644 test/WebSites/FiltersWebSite/Models/DummyClass.cs delete mode 100644 test/WebSites/FiltersWebSite/Services/DummyService.cs delete mode 100644 test/WebSites/FiltersWebSite/Services/RandomNumberService.cs delete mode 100644 test/WebSites/FiltersWebSite/Startup.cs delete mode 100644 test/WebSites/FiltersWebSite/readme.md diff --git a/Mvc.sln b/Mvc.sln index 332bcf9341..c413434a40 100644 --- a/Mvc.sln +++ b/Mvc.sln @@ -42,8 +42,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RazorWebSite", "test\WebSit EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FormatterWebSite", "test\WebSites\FormatterWebSite\FormatterWebSite.csproj", "{62735776-46FF-4170-9392-02E128A69B89}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FiltersWebSite", "test\WebSites\FiltersWebSite\FiltersWebSite.csproj", "{1976AC4A-FEA4-4587-A158-D9F79736D2B6}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiExplorerWebSite", "test\WebSites\ApiExplorerWebSite\ApiExplorerWebSite.csproj", "{61061528-071E-424E-965A-07BCC2F02672}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VersioningWebSite", "test\WebSites\VersioningWebSite\VersioningWebSite.csproj", "{C6304029-78C8-4604-99BE-2078DCA1DD36}" @@ -285,16 +283,6 @@ Global {62735776-46FF-4170-9392-02E128A69B89}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {62735776-46FF-4170-9392-02E128A69B89}.Release|Mixed Platforms.Build.0 = Release|Any CPU {62735776-46FF-4170-9392-02E128A69B89}.Release|x86.ActiveCfg = Release|Any CPU - {1976AC4A-FEA4-4587-A158-D9F79736D2B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1976AC4A-FEA4-4587-A158-D9F79736D2B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1976AC4A-FEA4-4587-A158-D9F79736D2B6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1976AC4A-FEA4-4587-A158-D9F79736D2B6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {1976AC4A-FEA4-4587-A158-D9F79736D2B6}.Debug|x86.ActiveCfg = Debug|Any CPU - {1976AC4A-FEA4-4587-A158-D9F79736D2B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1976AC4A-FEA4-4587-A158-D9F79736D2B6}.Release|Any CPU.Build.0 = Release|Any CPU - {1976AC4A-FEA4-4587-A158-D9F79736D2B6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {1976AC4A-FEA4-4587-A158-D9F79736D2B6}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {1976AC4A-FEA4-4587-A158-D9F79736D2B6}.Release|x86.ActiveCfg = Release|Any CPU {61061528-071E-424E-965A-07BCC2F02672}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {61061528-071E-424E-965A-07BCC2F02672}.Debug|Any CPU.Build.0 = Debug|Any CPU {61061528-071E-424E-965A-07BCC2F02672}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -878,7 +866,6 @@ Global {5F945B82-FE5F-425C-956C-8BC2F2020254} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1} {B07CAF59-11ED-40E3-A5DB-E1178F84FA78} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {62735776-46FF-4170-9392-02E128A69B89} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} - {1976AC4A-FEA4-4587-A158-D9F79736D2B6} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {61061528-071E-424E-965A-07BCC2F02672} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {C6304029-78C8-4604-99BE-2078DCA1DD36} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {6DB9B8D0-80F7-4E70-BBB0-0B4C04D79A47} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} diff --git a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/BasicTests.cs b/test/Microsoft.AspNetCore.Mvc.FunctionalTests/BasicTests.cs index 0e126fa5f5..b717f398d1 100644 --- a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/BasicTests.cs +++ b/test/Microsoft.AspNetCore.Mvc.FunctionalTests/BasicTests.cs @@ -473,24 +473,6 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests Assert.Equal("true", response); } - [Fact] - public async Task AlwaysRunResultFilters_CanRunWhenResourceFiltersShortCircuit() - { - // Arrange - var url = "Filters/AlwaysRunResultFiltersCanRunWhenResourceFilterShortCircuit"; - var request = new HttpRequestMessage(HttpMethod.Post, url) - { - Content = new StringContent("Test", Encoding.UTF8, "application/json"), - }; - - // Act - var response = await Client.SendAsync(request); - - // Assert - Assert.Equal(422, (int)response.StatusCode); - Assert.Equal("Can't process this!", await response.Content.ReadAsStringAsync()); - } - [Fact] public async Task ApplicationAssemblyPartIsListedAsFirstAssembly() { diff --git a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/FiltersTest.cs b/test/Microsoft.AspNetCore.Mvc.FunctionalTests/FiltersTest.cs index bbc00f9c4c..d08aed992a 100644 --- a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/FiltersTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.FunctionalTests/FiltersTest.cs @@ -1,113 +1,28 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using System.Collections.Generic; -using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; -using FiltersWebSite; -using Microsoft.AspNetCore.Mvc.Formatters.Xml; using Xunit; namespace Microsoft.AspNetCore.Mvc.FunctionalTests { - public class FiltersTest : IClassFixture> + public class FiltersTest : IClassFixture> { - public FiltersTest(MvcTestFixture fixture) + public FiltersTest(MvcTestFixture fixture) { Client = fixture.Client; } public HttpClient Client { get; } - // A controller can only be an action filter and result filter, so we don't have entries - // for the other filter types implemented by the controller. [Fact] - public async Task ListAllFilters() - { - // Arrange - var expected = new string[] - { - "Global Authorization Filter - OnAuthorization", - "On Controller Authorization Filter - OnAuthorization", - "Authorize Filter On Action - OnAuthorization", - "Global Resource Filter - OnResourceExecuting", - "Controller Resource Filter - OnResourceExecuting", - "Action Resource Filter - OnResourceExecuting", - "Controller Override - OnActionExecuting", - "Global Action Filter - OnActionExecuting", - "On Controller Action Filter - OnActionExecuting", - "On Action Action Filter - OnActionExecuting", - "Executing Action", - "On Action Action Filter - OnActionExecuted", - "On Controller Action Filter - OnActionExecuted", - "Global Action Filter - OnActionExecuted", - "Controller Override - OnActionExecuted", - "Controller Override - OnResultExecuting", - "Global Result Filter - OnResultExecuted", - "On Controller Result Filter - OnResultExecuting", - "On Action Result Filter - OnResultExecuting", - "On Action Result Filter - OnResultExecuted", - "On Controller Result Filter - OnResultExecuted", - "Global Result Filter - OnResultExecuted", - "Controller Override - OnResultExecuted", - "Action Resource Filter - OnResourceExecuted", - "Controller Resource Filter - OnResourceExecuted", - "Global Resource Filter - OnResourceExecuted", - }; - - // Act - var response = await Client.GetAsync("http://localhost/Products/GetPrice/5"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - - var body = await response.Content.ReadAsStringAsync(); - - var filters = response.Headers.GetValues("filters").ToArray(); - - var i = 0; - foreach (var filter in filters) - { - Assert.Equal(expected[i++], filter); - } - - Assert.Equal(expected.Length, filters.Length); - } - - [Fact] - public async Task AnonymousUsersAreBlocked() + public async Task CanAuthorize_UsersByRole() { // Arrange & Act - var response = await Client.GetAsync("http://localhost/Anonymous/GetHelloWorld"); - - // Assert - Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); - } - - [Fact] - public async Task AllowsAnonymousUsersToAccessController() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/RandomNumber/GetRandomNumber"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("4", await response.Content.ReadAsStringAsync()); - } - - - [Theory] - [InlineData("AdminRole")] - [InlineData("InteractiveUsers")] - [InlineData("ApiManagers")] - public async Task CanAuthorize(string testAction) - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/AuthorizeUser/" + testAction); + var response = await Client.GetAsync("AuthorizeUser/AdminRole"); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -115,10 +30,10 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests } [Fact] - public async Task AllowAnonymousOverridesAuthorize() + public async Task CanAuthorize_UsersByPolicyRequirements() { // Arrange & Act - var response = await Client.GetAsync("http://localhost/AuthorizeUser/AlwaysCanCallAllowAnonymous"); + var response = await Client.GetAsync("AuthorizeUser/ApiManagers"); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -129,414 +44,12 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests public async Task ImpossiblePolicyFailsAuthorize() { // Arrange & Act - var response = await Client.GetAsync("http://localhost/AuthorizeUser/Impossible"); + var response = await Client.GetAsync("AuthorizeUser/Impossible"); // Assert Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode); } - [Fact] - public async Task ServiceFilterUsesRegisteredServicesAsFilter() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/RandomNumber/GetRandomNumber"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("4", await response.Content.ReadAsStringAsync()); - } - - [Fact] - public async Task ServiceFilterThrowsIfServiceIsNotRegistered() - { - // Arrange - var url = "http://localhost/RandomNumber/GetAuthorizedRandomNumber"; - - // Act - var response = await Client.GetAsync(url); - - // Assert - var exception = response.GetServerException(); - Assert.Equal(typeof(InvalidOperationException).FullName, exception.ExceptionType); - } - - [Fact] - public async Task TypeFilterInitializesArguments() - { - // Arrange - var url = "http://localhost/RandomNumber/GetModifiedRandomNumber?randomNumber=10"; - - // Act - var response = await Client.GetAsync(url); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("22", await response.Content.ReadAsStringAsync()); - } - - [Fact] - public async Task TypeFilterThrowsIfServicesAreNotRegistered() - { - // Arrange - var url = "http://localhost/RandomNumber/GetHalfOfModifiedRandomNumber?randomNumber=3"; - - // Act - var response = await Client.GetAsync(url); - - // Assert - var exception = response.GetServerException(); - Assert.Equal(typeof(InvalidOperationException).FullName, exception.ExceptionType); - } - - [Fact] - public async Task ActionFilterOverridesActionExecuted() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/XmlSerializer/GetDummyClass?sampleInput=10"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - XmlAssert.Equal("10", - await response.Content.ReadAsStringAsync()); - } - - [Fact] - public async Task ResultFilterOverridesOnResultExecuting() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/DummyClass/GetDummyClass"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - XmlAssert.Equal("120", - await response.Content.ReadAsStringAsync()); - } - - [Fact] - public async Task ResultFilterOverridesOnResultExecuted() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/DummyClass/GetEmptyActionResult"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - var result = response.Headers.GetValues("OnResultExecuted"); - Assert.Equal(new string[] { "ResultExecutedSuccessfully" }, result); - } - - // Verifies result filter is executed after action filter. - [Fact] - public async Task OrderOfExecutionOfFilters_WhenOrderAttribute_IsNotMentioned() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/Home/GetSampleString"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("Result filter, Action Filter - OnActionExecuted, From Controller", - await response.Content.ReadAsStringAsync()); - } - - // Action filter handles the exception thrown in the action. - // Verifies if Result filter is executed after that. - [Fact] - public async Task ExceptionsHandledInActionFilters_WillNotShortCircuitResultFilters() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/Home/ThrowExceptionAndHandleInActionFilter"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("Result filter, Hi from Action Filter", await response.Content.ReadAsStringAsync()); - } - - // Exception filter present on the Action handles the exception, followed by Global Exception filter. - // Verifies that Result filter is skipped. - [Fact] - public async Task ExceptionFilter_OnAction_ShortCircuitsResultFilters() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/Home/ThrowExcpetion"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal( - "GlobalExceptionFilter.OnException, Action Exception Filter", - await response.Content.ReadAsStringAsync()); - } - - // No Exception filter is present on Action, Controller. - // Verifies if Global exception filter handles the exception. - [Fact] - public async Task GlobalExceptionFilter_HandlesAnException() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/Exception/GetError?error=RandomError"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("GlobalExceptionFilter.OnException", await response.Content.ReadAsStringAsync()); - } - - // Action, Controller, and a Global Exception filters are present. - // Verifies they are executed in the above mentioned order. - [Fact] - public async Task ExceptionFilter_Scope() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/ExceptionOrder/GetError"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal( - "GlobalExceptionFilter.OnException, " + - "ControllerExceptionFilter.OnException, " + - "Action Exception Filter", - await response.Content.ReadAsStringAsync()); - } - - // Action, Controller have an action filter. - // Verifies they are executed in the mentioned order. - [Fact] - public async Task ActionFilter_Scope() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/ActionFilter/GetHelloWorld"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal( - "Controller override - OnActionExecuted, " + - "GlobalActionFilter.OnActionExecuted, " + - "Controller Action filter - OnActionExecuted, " + - "Action Filter - OnActionExecuted, " + - "Hello World, " + // Return value from Action - "Action Filter - OnActionExecuting, " + - "Controller Action filter - OnActionExecuting, " + - "GlobalActionFilter.OnActionExecuting, " + - "Controller override - OnActionExecuting", - await response.Content.ReadAsStringAsync()); - } - - // Action, Controller have an result filter. - // Verifies that Controller Result filter is executed before Action filter. - [Fact] - public async Task ResultFilter_Scope() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/ResultFilter/GetHelloWorld"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal( - "Result filter, " + - "Controller Result filter, " + - "GlobalResultFilter.OnResultExecuting, " + - "Controller Override, " + - "Hello World", // Return value from Action - await response.Content.ReadAsStringAsync()); - } - - // Action has multiple TypeFilters with Order. - // Verifies if the filters are executed in the mentioned order. - [Fact] - public async Task FiltersWithOrder() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/RandomNumber/GetOrderedRandomNumber"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("88", await response.Content.ReadAsStringAsync()); - } - - // Action has multiple action filters with Order. - // Verifies they are executed in the mentioned order. - [Fact] - public async Task ActionFiltersWithOrder() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/Home/ActionFilterOrder"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal( - "Action Filter - OnActionExecuted, " + - "Controller Action filter - OnActionExecuted, " + - "Hello World", // Return value from Action - await response.Content.ReadAsStringAsync()); - } - - // Action has multiple result filters with Order. - // Verifies they are executed in the mentioned order. - [Fact] - public async Task ResultFiltersWithOrder() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/Home/ResultFilterOrder"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal( - "Result filter, Controller Result filter, Hello World", - await response.Content.ReadAsStringAsync()); - } - - // Action has an action filter which sets the Result. - // Verifies the Action was not executed - [Fact] - public async Task ActionFilterShortCircuitsAction() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/DummyClass/ActionNeverGetsExecuted"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("The Action was never executed", await response.Content.ReadAsStringAsync()); - } - - // Action has an Result filter which sets the Result. - // Verifies ObjectResult was not executed. - [Fact] - public async Task ResultFilterShortCircuitsResult() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/DummyClass/ResultNeverGetsExecuted"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("The Result was never executed", await response.Content.ReadAsStringAsync()); - } - - // Action has two Exception filters. - // Verifies that the second Exception Filter was not executed. - [Fact] - public async Task ExceptionFilterShortCircuitsAnotherExceptionFilter() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/Home/ThrowRandomExcpetion"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal(string.Empty, await response.Content.ReadAsStringAsync()); - } - - // Result Filter throws. - // Exception Filters don't get a chance to handle this. - [Fact] - public async Task ThrowingFilters_ResultFilter_NotHandledByGlobalExceptionFilter() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/Home/ThrowingResultFilter"); - - // Assert - var exception = response.GetServerException(); - Assert.Equal(typeof(InvalidProgramException).FullName, exception.ExceptionType); - } - - // Action Filter throws. - // Verifies the Global Exception Filter handles it. - [Fact] - public async Task ThrowingFilters_ActionFilter_HandledByGlobalExceptionFilter() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/Home/ThrowingActionFilter"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("GlobalExceptionFilter.OnException", await response.Content.ReadAsStringAsync()); - } - - // Authorization Filter throws. - // Exception Filters don't get a chance to handle this. - [Fact] - public async Task ThrowingFilters_AuthFilter_NotHandledByGlobalExceptionFilter() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/Home/ThrowingAuthorizationFilter"); - - // Assert - var exception = response.GetServerException(); - Assert.Equal(typeof(InvalidProgramException).FullName, exception.ExceptionType); - } - - // Exception Filter throws. - // Verifies the thrown exception is ignored. - [Fact] - public async Task ThrowingExceptionFilter_ExceptionFilter_NotHandledByGlobalExceptionFilter() - { - // Arrange & Act - var response = await Client.GetAsync("http://localhost/Home/ThrowingExceptionFilter"); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("Throwing Exception Filter", await response.Content.ReadAsStringAsync()); - } - - [Fact] - public async Task ResourceFilter_ShortCircuitsUsingObjectResult_UsesOptions() - { - // Arrange - var input = "{ sampleInt: 10 }"; - var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/ResourceFilter/Post"); - request.Content = new StringContent(input, Encoding.UTF8, "application/json"); - - // Act - var response = await Client.SendAsync(request); - - // Assert - // Uses formatters from options. - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - - // Notice this has been formatted using StringOutputFormatter and not JsonOutputFormatter. - Assert.Equal("someValue", await response.Content.ReadAsStringAsync()); - } - - [Fact] - public async Task ResourceFilter_ShortCircuitsUsingObjectResult_WithJsonFormatter_ReturnsResponse() - { - // Arrange - var input = "{ sampleInt: 10 }"; - var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/ResourceFilter/Get"); - request.Content = new StringContent(input, Encoding.UTF8, "application/json"); - - // Act - var response = await Client.SendAsync(request); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("application/json", response.Content.Headers.ContentType.MediaType); - Assert.Equal("\"someValue\"", await response.Content.ReadAsStringAsync()); - } - - [Fact] - public async Task ResourceFilter_RemovingValueProviderFactoriesForAnAction_DoesNotAffectOtherActions() - { - // Request to an action which does NOT expect form value model binding - // Arrange & Act - var response = await Client.PostAsync( - "http://localhost/ResourceFilter/FormValueModelBinding_Disabled", - new FormUrlEncodedContent(new[] { new KeyValuePair("SampleInt", "10") })); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("text/plain", response.Content.Headers.ContentType.MediaType); - Assert.Equal("Data:0", await response.Content.ReadAsStringAsync()); - - // Request to an action which expects form value model binding - // Arrange & Act - response = await Client.PostAsync( - "http://localhost/ResourceFilter/FormValueModelBinding_Enabled", - new FormUrlEncodedContent(new[] { new KeyValuePair("SampleInt", "10") })); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("text/plain", response.Content.Headers.ContentType.MediaType); - Assert.Equal("Data:10", await response.Content.ReadAsStringAsync()); - } - [Theory] [InlineData("en-US", "en-US")] [InlineData("fr", "fr")] @@ -546,7 +59,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests string expected) { // Arrange & Act - var response = await Client.GetAsync($"http://localhost/{culture}/MiddlewareFilterTest/CultureFromRouteData"); + var response = await Client.GetAsync($"{culture}/Filters/MiddlewareFilterTest"); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -554,5 +67,51 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests $"CurrentCulture:{expected},CurrentUICulture:{expected}", await response.Content.ReadAsStringAsync()); } + + [Fact] + public async Task AlwaysRunResultFilters_CanRunWhenResourceFiltersShortCircuit() + { + // Arrange + var url = "Filters/AlwaysRunResultFiltersCanRunWhenResourceFilterShortCircuit"; + var request = new HttpRequestMessage(HttpMethod.Post, url) + { + Content = new StringContent("Test", Encoding.UTF8, "application/json"), + }; + + // Act + var response = await Client.SendAsync(request); + + // Assert + Assert.Equal(422, (int)response.StatusCode); + Assert.Equal("Can't process this!", await response.Content.ReadAsStringAsync()); + } + + [Fact] + public async Task FiltersCanBeDeclaredGlobally() + { + // Arrange + var url = "Filters/TraceResult"; + + // Act + var response = await Client.GetStringAsync(url); + + // Assert + Assert.Equal("This value was set by TraceResourceFilter", response); + } + + [Fact] + public async Task ServiceFiltersWork() + { + // Arrange + var url = "Filters/ServiceFilterTest"; + + // Act + var response = await Client.GetAsync(url); + + // Assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal("Service filter content", await response.Content.ReadAsStringAsync()); + Assert.Equal(new[] { "True" }, response.Headers.GetValues("X-ServiceActionFilter")); + } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/HttpResponseMessageExceptions.cs b/test/Microsoft.AspNetCore.Mvc.FunctionalTests/HttpResponseMessageExceptions.cs deleted file mode 100644 index d871cde089..0000000000 --- a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/HttpResponseMessageExceptions.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Net; -using System.Net.Http; -using FiltersWebSite; -using Xunit; -using Xunit.Sdk; - -namespace Microsoft.AspNetCore.Mvc.FunctionalTests -{ - public static class HttpResponseMessageExceptions - { - public static ExceptionInfo GetServerException(this HttpResponseMessage response) - { - if (response.StatusCode != HttpStatusCode.InternalServerError) - { - throw new AssertActualExpectedException( - HttpStatusCode.InternalServerError, - response.StatusCode, - "A server-side exception should be returned as a 500."); - } - - var headers = response.Headers; - - IEnumerable exceptionMessageHeader; - IEnumerable exceptionTypeHeader; - if (!headers.TryGetValues(ErrorReporterMiddleware.ExceptionMessageHeader, out exceptionMessageHeader)) - { - throw new XunitException( - "No value for the '" + ErrorReporterMiddleware.ExceptionMessageHeader + "' header."); - } - - if (!headers.TryGetValues(ErrorReporterMiddleware.ExceptionTypeHeader, out exceptionTypeHeader)) - { - throw new XunitException( - "No value for the '" + ErrorReporterMiddleware.ExceptionTypeHeader + "' header."); - } - - return new ExceptionInfo() - { - ExceptionMessage = Assert.Single(exceptionMessageHeader), - ExceptionType = Assert.Single(exceptionTypeHeader), - }; - } - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Microsoft.AspNetCore.Mvc.FunctionalTests.csproj b/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Microsoft.AspNetCore.Mvc.FunctionalTests.csproj index e8db9d460a..d0790249be 100644 --- a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Microsoft.AspNetCore.Mvc.FunctionalTests.csproj +++ b/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Microsoft.AspNetCore.Mvc.FunctionalTests.csproj @@ -25,7 +25,6 @@ - diff --git a/test/WebSites/FiltersWebSite/BasicAuthenticationHandler.cs b/test/WebSites/BasicWebSite/BasicAuthenticationHandler.cs similarity index 73% rename from test/WebSites/FiltersWebSite/BasicAuthenticationHandler.cs rename to test/WebSites/BasicWebSite/BasicAuthenticationHandler.cs index 5ed39049b3..0044e91259 100644 --- a/test/WebSites/FiltersWebSite/BasicAuthenticationHandler.cs +++ b/test/WebSites/BasicWebSite/BasicAuthenticationHandler.cs @@ -10,11 +10,11 @@ using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -namespace FiltersWebSite +namespace BasicWebSite { - public class BasicAuthenticationHandler : AuthenticationHandler + public class BasicAuthenticationHandler : AuthenticationHandler { - public BasicAuthenticationHandler(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) + public BasicAuthenticationHandler(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) { } @@ -22,15 +22,18 @@ namespace FiltersWebSite { var principal = new ClaimsPrincipal(); principal.AddIdentity(new ClaimsIdentity( - new Claim[] { - new Claim("Permission", "CanViewPage"), + new[] + { new Claim("Manager", "yes"), new Claim(ClaimTypes.Role, "Administrator"), new Claim(ClaimTypes.NameIdentifier, "John") }, Scheme.Name)); - return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(principal, - new AuthenticationProperties(), Scheme.Name))); + + return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket( + principal, + new AuthenticationProperties(), + Scheme.Name))); } } -} \ No newline at end of file +} diff --git a/test/WebSites/BasicWebSite/BasicWebSite.csproj b/test/WebSites/BasicWebSite/BasicWebSite.csproj index b001b4aa71..55879651a0 100644 --- a/test/WebSites/BasicWebSite/BasicWebSite.csproj +++ b/test/WebSites/BasicWebSite/BasicWebSite.csproj @@ -8,6 +8,8 @@ + + diff --git a/test/WebSites/BasicWebSite/ConfigureAuthPolicies.cs b/test/WebSites/BasicWebSite/ConfigureAuthPolicies.cs new file mode 100644 index 0000000000..feb2cca8b5 --- /dev/null +++ b/test/WebSites/BasicWebSite/ConfigureAuthPolicies.cs @@ -0,0 +1,34 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Security.Claims; +using Microsoft.Extensions.DependencyInjection; + +namespace BasicWebSite +{ + internal static class ConfigureAuthPoliciesExtensions + { + public static void ConfigureBaseWebSiteAuthPolicies(this IServiceCollection services) + { + services.AddAuthorization(options => + { + // This policy cannot succeed since the claim is never added + options.AddPolicy("Impossible", policy => + { + policy.AuthenticationSchemes.Add("Api"); + policy.RequireClaim("Never"); + }); + options.AddPolicy("Api", policy => + { + policy.AuthenticationSchemes.Add("Api"); + policy.RequireClaim(ClaimTypes.NameIdentifier); + }); + options.AddPolicy("Api-Manager", policy => + { + policy.AuthenticationSchemes.Add("Api"); + policy.Requirements.Add(Operations.Edit); + }); + }); + } + } +} diff --git a/test/WebSites/FiltersWebSite/Controllers/AuthorizeUserController.cs b/test/WebSites/BasicWebSite/Controllers/AuthorizeUserController.cs similarity index 65% rename from test/WebSites/FiltersWebSite/Controllers/AuthorizeUserController.cs rename to test/WebSites/BasicWebSite/Controllers/AuthorizeUserController.cs index 704c606f7a..6de9d484de 100644 --- a/test/WebSites/FiltersWebSite/Controllers/AuthorizeUserController.cs +++ b/test/WebSites/BasicWebSite/Controllers/AuthorizeUserController.cs @@ -1,10 +1,11 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; -namespace FiltersWebSite +namespace BasicWebSite { [Authorize("Api")] public class AuthorizeUserController : Controller @@ -21,23 +22,10 @@ namespace FiltersWebSite return "Hello World!"; } - [Authorize("Interactive")] - public string InteractiveUsers() - { - return "Hello World!"; - } - - [Authorize("Impossible")] - [AllowAnonymous] - public string AlwaysCanCallAllowAnonymous() - { - return "Hello World!"; - } - [Authorize("Impossible")] public string Impossible() { - return "Hello World!"; + throw new Exception("Shouldn't be invoked."); } } -} \ No newline at end of file +} diff --git a/test/WebSites/BasicWebSite/Controllers/FiltersController.cs b/test/WebSites/BasicWebSite/Controllers/FiltersController.cs index 49c5009ef6..75addb6f6b 100644 --- a/test/WebSites/BasicWebSite/Controllers/FiltersController.cs +++ b/test/WebSites/BasicWebSite/Controllers/FiltersController.cs @@ -2,12 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; -using System.Threading.Tasks; +using System.Globalization; using BasicWebSite.Models; -using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Newtonsoft.Json.Serialization; namespace BasicWebSite.Controllers { @@ -18,5 +16,18 @@ namespace BasicWebSite.Controllers [UnprocessableResultFilter] public IActionResult AlwaysRunResultFiltersCanRunWhenResourceFilterShortCircuit([FromBody] Product product) => throw new Exception("Shouldn't be executed"); + + [ServiceFilter(typeof(ServiceActionFilter))] + public IActionResult ServiceFilterTest() => Content("Service filter content"); + + [TraceResultOutputFilter] + public IActionResult TraceResult() => new EmptyResult(); + + [Route("{culture}/[controller]/[action]")] + [MiddlewareFilter(typeof(LocalizationPipeline))] + public IActionResult MiddlewareFilterTest() + { + return Content($"CurrentCulture:{CultureInfo.CurrentCulture.Name},CurrentUICulture:{CultureInfo.CurrentUICulture.Name}"); + } } } diff --git a/test/WebSites/BasicWebSite/Filters/ServiceActionFilter.cs b/test/WebSites/BasicWebSite/Filters/ServiceActionFilter.cs new file mode 100644 index 0000000000..68f002cab2 --- /dev/null +++ b/test/WebSites/BasicWebSite/Filters/ServiceActionFilter.cs @@ -0,0 +1,29 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc.Filters; +using Microsoft.Extensions.Logging; + +namespace BasicWebSite +{ + public class ServiceActionFilter : IActionFilter + { + private readonly ILogger _logger; + + public ServiceActionFilter(ILogger logger) + { + _logger = logger; + } + + public void OnActionExecuted(ActionExecutedContext context) + { + } + + public void OnActionExecuting(ActionExecutingContext context) + { + _logger.LogInformation($"Executing {nameof(ServiceActionFilter)}."); + context.HttpContext.Response.Headers["X-ServiceActionFilter"] = "True"; + } + } +} diff --git a/test/WebSites/FiltersWebSite/Filters/ShortCircuitResultFilter.cs b/test/WebSites/BasicWebSite/Filters/TraceOutputResultFilter.cs similarity index 54% rename from test/WebSites/FiltersWebSite/Filters/ShortCircuitResultFilter.cs rename to test/WebSites/BasicWebSite/Filters/TraceOutputResultFilter.cs index 047d2f9834..91c3b8d4b0 100644 --- a/test/WebSites/FiltersWebSite/Filters/ShortCircuitResultFilter.cs +++ b/test/WebSites/BasicWebSite/Filters/TraceOutputResultFilter.cs @@ -1,19 +1,19 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; +using Microsoft.Extensions.Logging; -namespace FiltersWebSite +namespace BasicWebSite { - public class ShortCircuitResultFilter : ResultFilterAttribute + public class TraceResultOutputFilter : ResultFilterAttribute { public override void OnResultExecuting(ResultExecutingContext context) { - context.Result = new ContentResult - { - Content = "The Result was never executed" - }; + var trace = context.HttpContext.Items[nameof(TraceResourceFilter)]; + context.Result = new ObjectResult(trace); } } -} \ No newline at end of file +} diff --git a/test/WebSites/BasicWebSite/Filters/TraceResourceFilter.cs b/test/WebSites/BasicWebSite/Filters/TraceResourceFilter.cs new file mode 100644 index 0000000000..2a2196d47a --- /dev/null +++ b/test/WebSites/BasicWebSite/Filters/TraceResourceFilter.cs @@ -0,0 +1,21 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc.Filters; + +namespace BasicWebSite +{ + public class TraceResourceFilter : IResourceFilter + { + + public void OnResourceExecuted(ResourceExecutedContext context) + { + } + + public void OnResourceExecuting(ResourceExecutingContext context) + { + context.HttpContext.Items[nameof(TraceResourceFilter)] = $"This value was set by {nameof(TraceResourceFilter)}"; + } + } +} diff --git a/test/WebSites/FiltersWebSite/LocalizationPipeline.cs b/test/WebSites/BasicWebSite/LocalizationPipeline.cs similarity index 92% rename from test/WebSites/FiltersWebSite/LocalizationPipeline.cs rename to test/WebSites/BasicWebSite/LocalizationPipeline.cs index ad0623722e..9273dbcbaa 100644 --- a/test/WebSites/FiltersWebSite/LocalizationPipeline.cs +++ b/test/WebSites/BasicWebSite/LocalizationPipeline.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Globalization; @@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.Mvc.Localization; using Microsoft.AspNetCore.Localization.Routing; -namespace FiltersWebSite +namespace BasicWebSite { public class LocalizationPipeline { diff --git a/test/WebSites/FiltersWebSite/ManagerHandler.cs b/test/WebSites/BasicWebSite/ManagerHandler.cs similarity index 97% rename from test/WebSites/FiltersWebSite/ManagerHandler.cs rename to test/WebSites/BasicWebSite/ManagerHandler.cs index 8d7ed7945d..b681e21757 100644 --- a/test/WebSites/FiltersWebSite/ManagerHandler.cs +++ b/test/WebSites/BasicWebSite/ManagerHandler.cs @@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization.Infrastructure; using Microsoft.Extensions.DependencyInjection; -namespace FiltersWebSite +namespace BasicWebSite { public class ManagerHandler : AuthorizationHandler { diff --git a/test/WebSites/FiltersWebSite/Operations.cs b/test/WebSites/BasicWebSite/Operations.cs similarity index 59% rename from test/WebSites/FiltersWebSite/Operations.cs rename to test/WebSites/BasicWebSite/Operations.cs index 1333cc02d0..2ce19488c0 100644 --- a/test/WebSites/FiltersWebSite/Operations.cs +++ b/test/WebSites/BasicWebSite/Operations.cs @@ -3,12 +3,10 @@ using Microsoft.AspNetCore.Authorization.Infrastructure; -namespace FiltersWebSite +namespace BasicWebSite { public static class Operations { public static OperationAuthorizationRequirement Edit = new OperationAuthorizationRequirement { Name = "Edit" }; - public static OperationAuthorizationRequirement Create = new OperationAuthorizationRequirement { Name = "Create" }; - public static OperationAuthorizationRequirement Delete = new OperationAuthorizationRequirement { Name = "Delete" }; } } diff --git a/test/WebSites/BasicWebSite/Startup.cs b/test/WebSites/BasicWebSite/Startup.cs index 9439375371..784a29f3e5 100644 --- a/test/WebSites/BasicWebSite/Startup.cs +++ b/test/WebSites/BasicWebSite/Startup.cs @@ -2,6 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Linq; +using System.Security.Claims; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Abstractions; @@ -14,8 +17,17 @@ namespace BasicWebSite // Set up application services public void ConfigureServices(IServiceCollection services) { + services.AddAuthentication() + .AddScheme("Api", _ => { }); + services.AddTransient(); + services - .AddMvc(options => options.Conventions.Add(new ApplicationDescription("This is a basic website."))) + .AddMvc(options => + { + options.Conventions.Add(new ApplicationDescription("This is a basic website.")); + // Filter that records a value in HttpContext.Items + options.Filters.Add(new TraceResourceFilter()); + }) .AddXmlDataContractSerializerFormatters(); services.Configure(options => @@ -34,11 +46,16 @@ namespace BasicWebSite }; }); + services.ConfigureBaseWebSiteAuthPolicies(); + + services.AddTransient(); + services.AddLogging(); services.AddSingleton(); services.AddHttpContextAccessor(); services.AddSingleton(); services.AddScoped(); + services.AddTransient(); } public void Configure(IApplicationBuilder app) diff --git a/test/WebSites/BasicWebSite/StartupRequestLimitSize.cs b/test/WebSites/BasicWebSite/StartupRequestLimitSize.cs index 192dc63d80..0338d0b217 100644 --- a/test/WebSites/BasicWebSite/StartupRequestLimitSize.cs +++ b/test/WebSites/BasicWebSite/StartupRequestLimitSize.cs @@ -14,6 +14,7 @@ namespace BasicWebSite public void ConfigureServices(IServiceCollection services) { services.AddMvc(); + services.ConfigureBaseWebSiteAuthPolicies(); } public void Configure(IApplicationBuilder app) diff --git a/test/WebSites/BasicWebSite/StartupWithCookieTempDataProviderAndCookieConsent.cs b/test/WebSites/BasicWebSite/StartupWithCookieTempDataProviderAndCookieConsent.cs index 7030e5eaaa..0fdb7383b6 100644 --- a/test/WebSites/BasicWebSite/StartupWithCookieTempDataProviderAndCookieConsent.cs +++ b/test/WebSites/BasicWebSite/StartupWithCookieTempDataProviderAndCookieConsent.cs @@ -16,6 +16,8 @@ namespace BasicWebSite { o.CheckConsentNeeded = httpContext => true; }); + + services.ConfigureBaseWebSiteAuthPolicies(); } public void Configure(IApplicationBuilder app) diff --git a/test/WebSites/BasicWebSite/StartupWithSessionTempDataProvider.cs b/test/WebSites/BasicWebSite/StartupWithSessionTempDataProvider.cs index cc13dd6695..c05e83cb95 100644 --- a/test/WebSites/BasicWebSite/StartupWithSessionTempDataProvider.cs +++ b/test/WebSites/BasicWebSite/StartupWithSessionTempDataProvider.cs @@ -15,6 +15,8 @@ namespace BasicWebSite .AddMvc() .AddSessionStateTempDataProvider(); services.AddSession(); + + services.ConfigureBaseWebSiteAuthPolicies(); } public void Configure(IApplicationBuilder app) diff --git a/test/WebSites/FiltersWebSite/BasicOptions.cs b/test/WebSites/FiltersWebSite/BasicOptions.cs deleted file mode 100644 index c85516a97c..0000000000 --- a/test/WebSites/FiltersWebSite/BasicOptions.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Security.Claims; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Options; - -namespace FiltersWebSite -{ - public class BasicOptions : AuthenticationSchemeOptions - { - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Controllers/ActionFilterController.cs b/test/WebSites/FiltersWebSite/Controllers/ActionFilterController.cs deleted file mode 100644 index 41971b461d..0000000000 --- a/test/WebSites/FiltersWebSite/Controllers/ActionFilterController.cs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - [ControllerActionFilter] - public class ActionFilterController : Controller - { - [ChangeContentActionFilter] - public IActionResult GetHelloWorld(IList fromGlobalActionFilter) - { - // Should have got content from Global Action Filter followed by Controller Override. - if (fromGlobalActionFilter != null) - { - ContentResult combinedResult = null; - var resultsFromActionFilters = fromGlobalActionFilter as List; - foreach (var result in resultsFromActionFilters) - { - combinedResult = Helpers.GetContentResult(combinedResult, result.Content); - } - - return Helpers.GetContentResult(combinedResult, "Hello World"); - } - - return null; - } - - public override void OnActionExecuting(ActionExecutingContext context) - { - object obj; - List filters; - - if (context.ActionArguments.TryGetValue("fromGlobalActionFilter", out obj)) - { - filters = (List)obj; - } - else - { - filters = new List(); - context.ActionArguments.Add("fromGlobalActionFilter", filters); - } - - filters.Add(Helpers.GetContentResult(context.Result, "Controller override - OnActionExecuting")); - } - - public override void OnActionExecuted(ActionExecutedContext context) - { - context.Result = Helpers.GetContentResult(context.Result, "Controller override - OnActionExecuted"); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Controllers/AnonymousController.cs b/test/WebSites/FiltersWebSite/Controllers/AnonymousController.cs deleted file mode 100644 index b70ad1f435..0000000000 --- a/test/WebSites/FiltersWebSite/Controllers/AnonymousController.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc; - -namespace FiltersWebSite -{ - [BlockAnonymous] - public class AnonymousController : Controller - { - public string GetHelloWorld() - { - return "Hello World!"; - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Controllers/DummyClassController.cs b/test/WebSites/FiltersWebSite/Controllers/DummyClassController.cs deleted file mode 100644 index 39dc423fd1..0000000000 --- a/test/WebSites/FiltersWebSite/Controllers/DummyClassController.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; - -namespace FiltersWebSite -{ - public class DummyClassController : Controller - { - [ModifyResultsFilter] - public DummyClass GetDummyClass() - { - return new DummyClass() - { - SampleInt = 10 - }; - } - - [AddHeader] - public IActionResult GetEmptyActionResult() - { - return new TestActionResult(); - } - - [ShortCircuitActionFilter] - public string ActionNeverGetsExecuted() - { - return "Hello World!"; - } - - [ShortCircuitResultFilter] - public IActionResult ResultNeverGetsExecuted() - { - return new ObjectResult("Returned in Object Result"); - } - } - - public class TestActionResult : IActionResult - { - public Task ExecuteResultAsync(ActionContext context) - { - return Task.FromResult(true); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Controllers/ExceptionController.cs b/test/WebSites/FiltersWebSite/Controllers/ExceptionController.cs deleted file mode 100644 index 4aeaa13e88..0000000000 --- a/test/WebSites/FiltersWebSite/Controllers/ExceptionController.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Mvc; - -namespace FiltersWebSite -{ - public class ExceptionController : Controller - { - public string GetError(string error) - { - throw new InvalidOperationException(error); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Controllers/ExceptionOrderController.cs b/test/WebSites/FiltersWebSite/Controllers/ExceptionOrderController.cs deleted file mode 100644 index 628a0f18af..0000000000 --- a/test/WebSites/FiltersWebSite/Controllers/ExceptionOrderController.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Mvc; - -namespace FiltersWebSite -{ - [ControllerExceptionFilter] - public class ExceptionOrderController : Controller - { - [HandleInvalidOperationExceptionFilter] - public string GetError(string error) - { - throw new InvalidOperationException(error); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Controllers/HomeController.cs b/test/WebSites/FiltersWebSite/Controllers/HomeController.cs deleted file mode 100644 index df14cf0a72..0000000000 --- a/test/WebSites/FiltersWebSite/Controllers/HomeController.cs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Mvc; - -namespace FiltersWebSite.Controllers -{ - public class HomeController - { - [ChangeContentActionFilter] - [ChangeContentResultFilter] - public IActionResult GetSampleString() - { - return new ContentResult() - { - Content = "From Controller" - }; - } - - [ThrowingResultFilter] - [HandleInvalidOperationExceptionFilter] - public IActionResult ThrowExcpetion() - { - throw new InvalidOperationException("Controller threw."); - } - - [HandleExceptionActionFilter] - [ChangeContentResultFilter] - public IActionResult ThrowExceptionAndHandleInActionFilter() - { - throw new InvalidOperationException("Controller threw."); - } - - [ControllerActionFilter(Order = 2)] - [ChangeContentActionFilter(Order = 1)] - public IActionResult ActionFilterOrder() - { - return new ContentResult() - { - Content = "Hello World" - }; - } - - [ControllerResultFilter(Order = 1)] - [ChangeContentResultFilter(Order = 2)] - public IActionResult ResultFilterOrder() - { - return new ContentResult() - { - Content = "Hello World" - }; - } - - [ThrowingResultFilter] - public string ThrowingResultFilter() - { - return "Throwing Result Filter"; - } - - [ThrowingActionFilter] - public string ThrowingActionFilter() - { - return "Throwing Action Filter"; - } - - [ThrowingExceptionFilter] - public string ThrowingExceptionFilter() - { - return "Throwing Exception Filter"; - } - - [ThrowingAuthorizationFilter] - public string ThrowingAuthorizationFilter() - { - return "Throwing Authorization Filter"; - } - - [HandleInvalidOperationExceptionFilter] - [ShortCircuitExceptionFilter(Order=12)] - public IActionResult ThrowRandomExcpetion() - { - throw new InvalidOperationException("Controller threw."); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Controllers/MiddlewareFilterTestController.cs b/test/WebSites/FiltersWebSite/Controllers/MiddlewareFilterTestController.cs deleted file mode 100644 index 5bd49346ad..0000000000 --- a/test/WebSites/FiltersWebSite/Controllers/MiddlewareFilterTestController.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Globalization; -using Microsoft.AspNetCore.Mvc; - -namespace FiltersWebSite -{ - public class MiddlewareFilterTestController : Controller - { - [Route("{culture}/[controller]/[action]")] - [MiddlewareFilter(typeof(LocalizationPipeline))] - public IActionResult CultureFromRouteData() - { - return Content($"CurrentCulture:{CultureInfo.CurrentCulture.Name},CurrentUICulture:{CultureInfo.CurrentUICulture.Name}"); - } - } -} diff --git a/test/WebSites/FiltersWebSite/Controllers/ProductsController.cs b/test/WebSites/FiltersWebSite/Controllers/ProductsController.cs deleted file mode 100644 index 5bf27b7905..0000000000 --- a/test/WebSites/FiltersWebSite/Controllers/ProductsController.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - // This controller will list the filters that are configured for each action in a header. - // This exercises the merging of filters with the global filters collection. - [ControllerResultFilter] - [ControllerActionFilter] - [ControllerAuthorizationFilter] - [TracingResourceFilter("Controller Resource Filter")] - public class ProductsController : Controller, IResultFilter - { - [PassThroughResultFilter] - [PassThroughActionFilter] - [AuthorizeUser] - [TracingResourceFilter("Action Resource Filter")] - public IActionResult GetPrice(int id) - { - Response.Headers.Append("filters", "Executing Action"); - // This skips the ExecuteResultAsync in ActionResult. Thus result is not set. - // Hence we can see all the OnResultExecuted functions in the response. - return new TestActionResult(); - } - - public override void OnActionExecuting(ActionExecutingContext context) - { - context.HttpContext.Response.Headers.Append("filters", "Controller Override - OnActionExecuting"); - } - - public override void OnActionExecuted(ActionExecutedContext context) - { - context.HttpContext.Response.Headers.Append("filters", "Controller Override - OnActionExecuted"); - } - - public void OnResultExecuted(ResultExecutedContext context) - { - context.HttpContext.Response.Headers.Append("filters", "Controller Override - OnResultExecuted"); - } - - public void OnResultExecuting(ResultExecutingContext context) - { - context.HttpContext.Response.Headers.Append("filters", "Controller Override - OnResultExecuting"); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Controllers/RandomNumberController.cs b/test/WebSites/FiltersWebSite/Controllers/RandomNumberController.cs deleted file mode 100644 index 7c26dfe766..0000000000 --- a/test/WebSites/FiltersWebSite/Controllers/RandomNumberController.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace FiltersWebSite -{ - [AllowAnonymous] - [HandleInvalidOperationExceptionFilter] - public class RandomNumberController : Controller - { - [ServiceFilter(typeof(RandomNumberFilter))] - public int GetRandomNumber() - { - return 2; - } - - [ServiceFilter(typeof(AuthorizeUserAttribute))] - public int GetAuthorizedRandomNumber() - { - return 2; - } - - [TypeFilter(typeof(RandomNumberProvider))] - public int GetModifiedRandomNumber(int randomNumber) - { - return randomNumber / 2; - } - - [TypeFilter(typeof(ModifiedRandomNumberProvider))] - public int GetHalfOfModifiedRandomNumber(int randomNumber) - { - return randomNumber / 2; - } - - [TypeFilter(typeof(RandomNumberModifier), Order = 2)] - [TypeFilter(typeof(RandomNumberProvider), Order = 1)] - public int GetOrderedRandomNumber(int randomNumber) - { - return randomNumber; - } - - public string ThrowException() - { - throw new InvalidOperationException(); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Controllers/ResourceFilterController.cs b/test/WebSites/FiltersWebSite/Controllers/ResourceFilterController.cs deleted file mode 100644 index f11c73dd22..0000000000 --- a/test/WebSites/FiltersWebSite/Controllers/ResourceFilterController.cs +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Linq; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; -using Microsoft.AspNetCore.Mvc.Formatters; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; - -namespace FiltersWebSite.Controllers -{ - [Route("ResourceFilter/[action]")] - public class ResourceFilterController : Controller - { - [HttpPost] - [ShortCircuitWithFormatter] - public string Get() - { - return "NeverGetsExecuted"; - } - - [HttpPost] - [ShortCircuit] - public string Post() - { - return "NeverGetsExecuted"; - } - - [HttpPost] - public IActionResult FormValueModelBinding_Enabled(DummyClass dc) - { - if (!ModelState.IsValid) - { - return BadRequest(ModelState); - } - - return Ok("Data:" + dc?.SampleInt); - } - - [HttpPost] - [DisableFormValueModelBinding] - public IActionResult FormValueModelBinding_Disabled(DummyClass dc) - { - if (!ModelState.IsValid) - { - return BadRequest(ModelState); - } - - return Ok("Data:" + dc?.SampleInt); - } - - private class ShortCircuitWithFormatterAttribute : Attribute, IResourceFilter - { - public void OnResourceExecuted(ResourceExecutedContext context) - { - } - - public void OnResourceExecuting(ResourceExecutingContext context) - { - var mvcOptions = context.HttpContext.RequestServices.GetRequiredService>(); - var formatter = mvcOptions.Value.OutputFormatters.OfType().First(); - var result = new ObjectResult("someValue"); - result.Formatters.Add(formatter); - - context.Result = result; - } - } - - private class ShortCircuitAttribute : Attribute, IResourceFilter - { - public void OnResourceExecuted(ResourceExecutedContext context) - { - } - - public void OnResourceExecuting(ResourceExecutingContext context) - { - // ShortCircuit. - context.Result = new ObjectResult("someValue"); - } - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Controllers/ResultFilterController.cs b/test/WebSites/FiltersWebSite/Controllers/ResultFilterController.cs deleted file mode 100644 index 78aec66c33..0000000000 --- a/test/WebSites/FiltersWebSite/Controllers/ResultFilterController.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - [ControllerResultFilter] - public class ResultFilterController : Controller, IResultFilter - { - [ChangeContentResultFilter] - public IActionResult GetHelloWorld() - { - return Helpers.GetContentResult(null, "Hello World"); - } - - public void OnResultExecuted(ResultExecutedContext context) - { - } - - public void OnResultExecuting(ResultExecutingContext context) - { - context.Result = Helpers.GetContentResult(context.Result, "Controller Override"); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Controllers/XmlSerializerController.cs b/test/WebSites/FiltersWebSite/Controllers/XmlSerializerController.cs deleted file mode 100644 index b5840e4aa6..0000000000 --- a/test/WebSites/FiltersWebSite/Controllers/XmlSerializerController.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc; - -namespace FiltersWebSite -{ - [SerializationActionFilter] - public class XmlSerializerController : Controller - { - public DummyClass GetDummyClass(int sampleInput) - { - return new DummyClass { SampleInt = sampleInput }; - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/ErrorReporterMiddleware.cs b/test/WebSites/FiltersWebSite/ErrorReporterMiddleware.cs deleted file mode 100644 index c6f3f53e99..0000000000 --- a/test/WebSites/FiltersWebSite/ErrorReporterMiddleware.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; - -namespace FiltersWebSite -{ - /// - /// A middleware that reports errors via header values. Useful for tests that want to verify - /// an exception that goes unhandled by the MVC part of the stack. - /// - public class ErrorReporterMiddleware - { - public static readonly string ExceptionMessageHeader = "ExceptionMessage"; - public static readonly string ExceptionTypeHeader = "ExceptionType"; - - private readonly RequestDelegate _next; - - public ErrorReporterMiddleware(RequestDelegate next) - { - _next = next; - } - - public async Task Invoke(HttpContext context) - { - try - { - await _next(context); - } - catch (Exception exception) - { - if (context.Response.HasStarted) - { - throw; - } - else - { - context.Response.StatusCode = 500; - - var escapedMessage = exception.Message.Replace('\r', '_').Replace('\n', '_'); - - context.Response.Headers.Add(ExceptionTypeHeader, new string[] { exception.GetType().FullName }); - context.Response.Headers.Add(ExceptionMessageHeader, new string[] { escapedMessage }); - } - } - } - } -} diff --git a/test/WebSites/FiltersWebSite/Filters/AddHeaderAttribute.cs b/test/WebSites/FiltersWebSite/Filters/AddHeaderAttribute.cs deleted file mode 100644 index f0e7787ed1..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/AddHeaderAttribute.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class AddHeaderAttribute : ResultFilterAttribute - { - public override void OnResultExecuted(ResultExecutedContext context) - { - context.HttpContext.Response.Headers.Add( - "OnResultExecuted", new string[] { "ResultExecutedSuccessfully" }); - - base.OnResultExecuted(context); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/AuthorizeUserAttribute.cs b/test/WebSites/FiltersWebSite/Filters/AuthorizeUserAttribute.cs deleted file mode 100644 index aff9a0d13d..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/AuthorizeUserAttribute.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Reflection; -using System.Security.Claims; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc.Controllers; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class AuthorizeUserAttribute : Attribute, IAuthorizationFilter - { - public virtual void OnAuthorization(AuthorizationFilterContext context) - { - var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; - if (controllerActionDescriptor.MethodInfo == - typeof(ProductsController).GetMethod(nameof(ProductsController.GetPrice))) - { - context.HttpContext.Response.Headers.Append("filters", - "Authorize Filter On Action - OnAuthorization"); - } - - context.HttpContext.User = new ClaimsPrincipal( - new ClaimsIdentity( - new Claim[] { - new Claim("Permission", "CanViewPage"), - new Claim(ClaimTypes.Role, "Administrator"), - new Claim(ClaimTypes.NameIdentifier, "John")}, - "Basic")); - } - } -} diff --git a/test/WebSites/FiltersWebSite/Filters/BlockAnonymous.cs b/test/WebSites/FiltersWebSite/Filters/BlockAnonymous.cs deleted file mode 100644 index bc5707d2fa..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/BlockAnonymous.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Linq; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Authorization; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class BlockAnonymous : Attribute, IAuthorizationFilter - { - public void OnAuthorization(AuthorizationFilterContext context) - { - if (!HasAllowAnonymous(context)) - { - var user = context.HttpContext.User; - var userIsAnonymous = - user == null || - user.Identity == null || - !user.Identity.IsAuthenticated; - - if (userIsAnonymous) - { - context.Result = new UnauthorizedResult(); - } - } - } - - private bool HasAllowAnonymous(AuthorizationFilterContext context) - { - if (context == null) - { - throw new ArgumentNullException(nameof(context)); - } - - return context.Filters.Any(item => item is IAllowAnonymousFilter); - } - - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/ChangeContentActionFilter.cs b/test/WebSites/FiltersWebSite/Filters/ChangeContentActionFilter.cs deleted file mode 100644 index 55e74a1e1f..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ChangeContentActionFilter.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Collections.Generic; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Controllers; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class ChangeContentActionFilter : ActionFilterAttribute - { - public override void OnActionExecuted(ActionExecutedContext context) - { - context.Result = Helpers.GetContentResult(context.Result, "Action Filter - OnActionExecuted"); - } - - public override void OnActionExecuting(ActionExecutingContext context) - { - var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; - if (controllerActionDescriptor.MethodInfo == - typeof(ActionFilterController).GetMethod(nameof(ActionFilterController.GetHelloWorld))) - { - (context.ActionArguments["fromGlobalActionFilter"] as List). - Add(Helpers.GetContentResult(context.Result, "Action Filter - OnActionExecuting")); - } - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/ChangeContentResultFilter.cs b/test/WebSites/FiltersWebSite/Filters/ChangeContentResultFilter.cs deleted file mode 100644 index 973005e027..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ChangeContentResultFilter.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class ChangeContentResultFilter : ResultFilterAttribute - { - public override void OnResultExecuting(ResultExecutingContext context) - { - context.Result = Helpers.GetContentResult(context.Result, "Result filter"); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/ControllerActionFilter.cs b/test/WebSites/FiltersWebSite/Filters/ControllerActionFilter.cs deleted file mode 100644 index b887935756..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ControllerActionFilter.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Collections.Generic; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Controllers; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class ControllerActionFilter : ActionFilterAttribute - { - public override void OnActionExecuted(ActionExecutedContext context) - { - var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; - if (controllerActionDescriptor.MethodInfo == - typeof(ProductsController).GetMethod(nameof(ProductsController.GetPrice))) - { - context.HttpContext.Response.Headers.Append("filters", - "On Controller Action Filter - OnActionExecuted"); - } - else - { - context.Result = Helpers.GetContentResult(context.Result, "Controller Action filter - OnActionExecuted"); - } - } - - public override void OnActionExecuting(ActionExecutingContext context) - { - var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; - if (controllerActionDescriptor.MethodInfo == - typeof(ProductsController).GetMethod(nameof(ProductsController.GetPrice))) - { - context.HttpContext.Response.Headers.Append("filters", - "On Controller Action Filter - OnActionExecuting"); - } - - if (controllerActionDescriptor.MethodInfo == - typeof(ActionFilterController).GetMethod(nameof(ActionFilterController.GetHelloWorld))) - { - (context.ActionArguments["fromGlobalActionFilter"] as List) - .Add(Helpers.GetContentResult(context.Result, "Controller Action filter - OnActionExecuting")); - } - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/ControllerAuthorizationFilter.cs b/test/WebSites/FiltersWebSite/Filters/ControllerAuthorizationFilter.cs deleted file mode 100644 index de6f950198..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ControllerAuthorizationFilter.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class ControllerAuthorizationFilter : AuthorizeUserAttribute - { - public override void OnAuthorization(AuthorizationFilterContext context) - { - context.HttpContext.Response.Headers.Append("filters", "On Controller Authorization Filter - OnAuthorization"); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/ControllerExceptionFilter.cs b/test/WebSites/FiltersWebSite/Filters/ControllerExceptionFilter.cs deleted file mode 100644 index 0245a776de..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ControllerExceptionFilter.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class ControllerExceptionFilter : ExceptionFilterAttribute - { - public override void OnException(ExceptionContext context) - { - if (context.Exception.GetType() == typeof(InvalidOperationException)) - { - context.Result = Helpers.GetContentResult(context.Result, "ControllerExceptionFilter.OnException"); - } - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/ControllerResultFilter.cs b/test/WebSites/FiltersWebSite/Filters/ControllerResultFilter.cs deleted file mode 100644 index c94a1ebad8..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ControllerResultFilter.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc.Controllers; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class ControllerResultFilter : ResultFilterAttribute - { - public override void OnResultExecuting(ResultExecutingContext context) - { - var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; - if (controllerActionDescriptor.MethodInfo == - typeof(ProductsController).GetMethod(nameof(ProductsController.GetPrice))) - { - context.HttpContext.Response.Headers.Append("filters", - "On Controller Result Filter - OnResultExecuting"); - } - else - { - context.Result = Helpers.GetContentResult(context.Result, "Controller Result filter"); - } - } - - public override void OnResultExecuted(ResultExecutedContext context) - { - var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; - if (controllerActionDescriptor.MethodInfo == - typeof(ProductsController).GetMethod(nameof(ProductsController.GetPrice))) - { - context.HttpContext.Response.Headers.Append("filters", - "On Controller Result Filter - OnResultExecuted"); - } - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/DisableFormValueModelBindingAttribute.cs b/test/WebSites/FiltersWebSite/Filters/DisableFormValueModelBindingAttribute.cs deleted file mode 100644 index 9536d7a565..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/DisableFormValueModelBindingAttribute.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc.Filters; -using Microsoft.AspNetCore.Mvc.ModelBinding; - -namespace FiltersWebSite -{ - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] - public class DisableFormValueModelBindingAttribute : Attribute, IResourceFilter - { - public void OnResourceExecuting(ResourceExecutingContext context) - { - var formValueProviderFactory = context.ValueProviderFactories - .OfType() - .FirstOrDefault(); - if (formValueProviderFactory != null) - { - context.ValueProviderFactories.Remove(formValueProviderFactory); - } - - var jqueryFormValueProviderFactory = context.ValueProviderFactories - .OfType() - .FirstOrDefault(); - if (jqueryFormValueProviderFactory != null) - { - context.ValueProviderFactories.Remove(jqueryFormValueProviderFactory); - } - } - - public void OnResourceExecuted(ResourceExecutedContext context) - { - } - } -} diff --git a/test/WebSites/FiltersWebSite/Filters/GlobalActionFilter.cs b/test/WebSites/FiltersWebSite/Filters/GlobalActionFilter.cs deleted file mode 100644 index 861769fd67..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/GlobalActionFilter.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Reflection; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Controllers; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class GlobalActionFilter : IActionFilter - { - public void OnActionExecuted(ActionExecutedContext context) - { - var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; - if (controllerActionDescriptor.MethodInfo == - typeof(ActionFilterController).GetMethod(nameof(ActionFilterController.GetHelloWorld))) - { - context.Result = Helpers.GetContentResult(context.Result, "GlobalActionFilter.OnActionExecuted"); - } - - if (controllerActionDescriptor.MethodInfo == - typeof(ProductsController).GetMethod(nameof(ProductsController.GetPrice))) - { - context.HttpContext.Response.Headers.Append("filters", - "Global Action Filter - OnActionExecuted"); - } - } - - public void OnActionExecuting(ActionExecutingContext context) - { - var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; - if (controllerActionDescriptor.MethodInfo == - typeof(ActionFilterController).GetMethod(nameof(ActionFilterController.GetHelloWorld))) - { - (context.ActionArguments["fromGlobalActionFilter"] as List) - .Add(Helpers.GetContentResult(null, "GlobalActionFilter.OnActionExecuting")); - } - - if (controllerActionDescriptor.MethodInfo == - typeof(ProductsController).GetMethod(nameof(ProductsController.GetPrice))) - { - context.HttpContext.Response.Headers.Append("filters", - "Global Action Filter - OnActionExecuting"); - } - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/GlobalAuthorizationFilter.cs b/test/WebSites/FiltersWebSite/Filters/GlobalAuthorizationFilter.cs deleted file mode 100644 index 6ad76b5d57..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/GlobalAuthorizationFilter.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Reflection; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc.Controllers; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class GlobalAuthorizationFilter : Attribute, IAuthorizationFilter - { - public void OnAuthorization(AuthorizationFilterContext context) - { - var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; - if (controllerActionDescriptor.MethodInfo == - typeof(ProductsController).GetMethod(nameof(ProductsController.GetPrice))) - { - context.HttpContext.Response.Headers.Append("filters", - "Global Authorization Filter - OnAuthorization"); - } - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/GlobalExceptionFilter.cs b/test/WebSites/FiltersWebSite/Filters/GlobalExceptionFilter.cs deleted file mode 100644 index a105d78424..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/GlobalExceptionFilter.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class GlobalExceptionFilter : IExceptionFilter - { - public void OnException(ExceptionContext context) - { - context.Result = Helpers.GetContentResult(context.Result, "GlobalExceptionFilter.OnException"); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/GlobalResultFilter.cs b/test/WebSites/FiltersWebSite/Filters/GlobalResultFilter.cs deleted file mode 100644 index 79630e1daa..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/GlobalResultFilter.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc.Controllers; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class GlobalResultFilter : IResultFilter - { - public void OnResultExecuted(ResultExecutedContext context) - { - var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; - if (controllerActionDescriptor.MethodInfo == - typeof(ProductsController).GetMethod(nameof(ProductsController.GetPrice))) - { - context.HttpContext.Response.Headers.Append("filters", - "Global Result Filter - OnResultExecuted"); - } - } - - public void OnResultExecuting(ResultExecutingContext context) - { - var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; - if (controllerActionDescriptor.MethodInfo == - typeof(ResultFilterController).GetMethod(nameof(ResultFilterController.GetHelloWorld))) - { - context.Result = Helpers.GetContentResult(context.Result, "GlobalResultFilter.OnResultExecuting"); - } - - if (controllerActionDescriptor.MethodInfo == - typeof(ProductsController).GetMethod(nameof(ProductsController.GetPrice))) - { - context.HttpContext.Response.Headers.Append("filters", - "Global Result Filter - OnResultExecuted"); - } - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/HandleExceptionActionFilter.cs b/test/WebSites/FiltersWebSite/Filters/HandleExceptionActionFilter.cs deleted file mode 100644 index b36f27887f..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/HandleExceptionActionFilter.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class HandleExceptionActionFilter : ActionFilterAttribute - { - public override void OnActionExecuted(ActionExecutedContext context) - { - if (context.Exception != null) - { - context.Result = Helpers.GetContentResult(null, "Hi from Action Filter"); - - context.Exception = null; - } - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/HandleInvalidOperationExceptionFilter.cs b/test/WebSites/FiltersWebSite/Filters/HandleInvalidOperationExceptionFilter.cs deleted file mode 100644 index a1448fdfee..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/HandleInvalidOperationExceptionFilter.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class HandleInvalidOperationExceptionFilter : ExceptionFilterAttribute - { - public override void OnException(ExceptionContext context) - { - if (context.Exception.GetType() == typeof(InvalidOperationException)) - { - context.Result = Helpers.GetContentResult(context.Result, "Action Exception Filter"); - } - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/ModifiedRandomNumberProvider.cs b/test/WebSites/FiltersWebSite/Filters/ModifiedRandomNumberProvider.cs deleted file mode 100644 index 120f8f2b54..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ModifiedRandomNumberProvider.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class ModifiedRandomNumberProvider : IActionFilter - { - private DummyService _dummyService; - - public ModifiedRandomNumberProvider(DummyService dummyService) - { - _dummyService = dummyService; - } - - public void OnActionExecuted(ActionExecutedContext context) - { - } - - public void OnActionExecuting(ActionExecutingContext context) - { - context.ActionArguments["randomNumber"] = _dummyService.RandomNumber; - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/ModifyResultsFilterAttribute.cs b/test/WebSites/FiltersWebSite/Filters/ModifyResultsFilterAttribute.cs deleted file mode 100644 index b22b3f008a..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ModifyResultsFilterAttribute.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; -using Microsoft.AspNetCore.Mvc.Formatters; - -namespace FiltersWebSite -{ - public class ModifyResultsFilterAttribute : ResultFilterAttribute - { - public override void OnResultExecuting(ResultExecutingContext context) - { - var objResult = context.Result as ObjectResult; - var dummyClass = objResult.Value as DummyClass; - dummyClass.SampleInt = 120; - - objResult.Formatters.Add(new XmlSerializerOutputFormatter()); - - base.OnResultExecuting(context); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/PassThroughActionFilter.cs b/test/WebSites/FiltersWebSite/Filters/PassThroughActionFilter.cs deleted file mode 100644 index 13a998e668..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/PassThroughActionFilter.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class PassThroughActionFilter : ActionFilterAttribute - { - public override void OnActionExecuting(ActionExecutingContext context) - { - context.HttpContext.Response.Headers.Append("filters", "On Action Action Filter - OnActionExecuting"); - } - - public override void OnActionExecuted(ActionExecutedContext context) - { - context.HttpContext.Response.Headers.Append("filters", "On Action Action Filter - OnActionExecuted"); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/PassThroughResultFilter.cs b/test/WebSites/FiltersWebSite/Filters/PassThroughResultFilter.cs deleted file mode 100644 index 25d30f6d57..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/PassThroughResultFilter.cs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc.Controllers; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class PassThroughResultFilter : ResultFilterAttribute - { - public override void OnResultExecuting(ResultExecutingContext context) - { - var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; - if (controllerActionDescriptor.MethodInfo == - typeof(ProductsController).GetMethod(nameof(ProductsController.GetPrice))) - { - context.HttpContext.Response.Headers.Append("filters", - "On Action Result Filter - OnResultExecuting"); - } - } - - public override void OnResultExecuted(ResultExecutedContext context) - { - var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; - if (controllerActionDescriptor.MethodInfo == - typeof(ProductsController).GetMethod(nameof(ProductsController.GetPrice))) - { - context.HttpContext.Response.Headers.Append("filters", - "On Action Result Filter - OnResultExecuted"); - } - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/RandomNumberFilter.cs b/test/WebSites/FiltersWebSite/Filters/RandomNumberFilter.cs deleted file mode 100644 index b8262e046c..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/RandomNumberFilter.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; -using Microsoft.Net.Http.Headers; - -namespace FiltersWebSite -{ - public class RandomNumberFilter : IActionFilter - { - public void OnActionExecuted(ActionExecutedContext context) - { - context.Result = new ContentResult() - { - Content = "4", - ContentType = "text/plain" - }; - } - - public void OnActionExecuting(ActionExecutingContext context) - { - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/RandomNumberModifier.cs b/test/WebSites/FiltersWebSite/Filters/RandomNumberModifier.cs deleted file mode 100644 index 64427cac61..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/RandomNumberModifier.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class RandomNumberModifier : IActionFilter - { - private RandomNumberService _random; - - public RandomNumberModifier(RandomNumberService random) - { - _random = random; - } - - public void OnActionExecuted(ActionExecutedContext context) - { - } - - public void OnActionExecuting(ActionExecutingContext context) - { - var paramterValue = (int)context.ActionArguments["randomNumber"]; - context.ActionArguments["randomNumber"] = paramterValue + _random.GetRandamNumber(); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/RandomNumberProvider.cs b/test/WebSites/FiltersWebSite/Filters/RandomNumberProvider.cs deleted file mode 100644 index d91e03dcc8..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/RandomNumberProvider.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class RandomNumberProvider : IActionFilter - { - private RandomNumberService _random; - - public RandomNumberProvider(RandomNumberService random) - { - _random = random; - } - - public void OnActionExecuted(ActionExecutedContext context) - { - } - - public void OnActionExecuting(ActionExecutingContext context) - { - context.ActionArguments["randomNumber"] = _random.GetRandamNumber(); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/SerializationActionFilterAttribute.cs b/test/WebSites/FiltersWebSite/Filters/SerializationActionFilterAttribute.cs deleted file mode 100644 index e2553dc52d..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/SerializationActionFilterAttribute.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; -using Microsoft.AspNetCore.Mvc.Formatters; - -namespace FiltersWebSite -{ - public class SerializationActionFilterAttribute : ActionFilterAttribute - { - public override void OnActionExecuted(ActionExecutedContext context) - { - var result = context.Result as ObjectResult; - if (result != null) - { - result.Formatters.Add(new XmlSerializerOutputFormatter()); - } - - base.OnActionExecuted(context); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/ShortCircuitActionFilter.cs b/test/WebSites/FiltersWebSite/Filters/ShortCircuitActionFilter.cs deleted file mode 100644 index 91e2b8a4c3..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ShortCircuitActionFilter.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; -using Microsoft.Net.Http.Headers; - -namespace FiltersWebSite -{ - public class ShortCircuitActionFilter : ActionFilterAttribute - { - public override void OnActionExecuting(ActionExecutingContext context) - { - context.Result = new ContentResult - { - Content = "The Action was never executed", - ContentType = "text/plain" - }; - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/ShortCircuitExceptionFilter.cs b/test/WebSites/FiltersWebSite/Filters/ShortCircuitExceptionFilter.cs deleted file mode 100644 index 4dad66a947..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ShortCircuitExceptionFilter.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class ShortCircuitExceptionFilter : ExceptionFilterAttribute - { - public override void OnException(ExceptionContext context) - { - context.ExceptionHandled = true; - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/TestResourceFilter.cs b/test/WebSites/FiltersWebSite/Filters/TestResourceFilter.cs deleted file mode 100644 index 6d7f8e0715..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/TestResourceFilter.cs +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] - public class TestSyncResourceFilter : Attribute, IResourceFilter, IOrderedFilter - { - public enum Action - { - PassThrough, - ThrowException, - Shortcircuit - } - - public readonly string ExceptionMessage = $"Error!! in {nameof(TestSyncResourceFilter)}"; - - public readonly string ShortcircuitMessage = $"Shortcircuited by {nameof(TestSyncResourceFilter)}"; - - public Action FilterAction { get; set; } - - public int Order { get; set; } - - public void OnResourceExecuted(ResourceExecutedContext context) - { - } - - public void OnResourceExecuting(ResourceExecutingContext context) - { - if (FilterAction == Action.PassThrough) - { - return; - } - else if (FilterAction == Action.ThrowException) - { - throw new InvalidOperationException(ExceptionMessage); - } - else - { - context.Result = new ContentResult() - { - Content = ShortcircuitMessage, - StatusCode = 400, - ContentType = "text/abcd" - }; - } - } - } - - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] - public class TestAsyncResourceFilter : Attribute, IAsyncResourceFilter, IOrderedFilter - { - public enum Action - { - PassThrough, - ThrowException, - Shortcircuit - } - - public readonly string ExceptionMessage = $"Error!! in {nameof(TestAsyncResourceFilter)}"; - - public readonly string ShortcircuitMessage = $"Shortcircuited by {nameof(TestAsyncResourceFilter)}"; - - public Action FilterAction { get; set; } - - public int Order { get; set; } - - public Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next) - { - if (FilterAction == Action.PassThrough) - { - return next(); - } - else if (FilterAction == Action.ThrowException) - { - throw new InvalidOperationException(ExceptionMessage); - } - else - { - context.Result = new ContentResult() - { - Content = ShortcircuitMessage, - StatusCode = 400, - ContentType = "text/abcd" - }; - return Task.FromResult(true); - } - } - } -} diff --git a/test/WebSites/FiltersWebSite/Filters/ThrowingActionFilter.cs b/test/WebSites/FiltersWebSite/Filters/ThrowingActionFilter.cs deleted file mode 100644 index 4f00280d06..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ThrowingActionFilter.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class ThrowingActionFilter : ActionFilterAttribute - { - public override void OnActionExecuting(ActionExecutingContext context) - { - throw new InvalidProgramException("Action Filter threw"); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/ThrowingAuthorizationFilter.cs b/test/WebSites/FiltersWebSite/Filters/ThrowingAuthorizationFilter.cs deleted file mode 100644 index 1fba68673d..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ThrowingAuthorizationFilter.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class ThrowingAuthorizationFilter : Attribute, IAuthorizationFilter - { - public void OnAuthorization(AuthorizationFilterContext context) - { - throw new InvalidProgramException("Authorization Filter Threw"); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/ThrowingExceptionFilter.cs b/test/WebSites/FiltersWebSite/Filters/ThrowingExceptionFilter.cs deleted file mode 100644 index 649b53f708..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ThrowingExceptionFilter.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class ThrowingExceptionFilter : ExceptionFilterAttribute - { - public override void OnException(ExceptionContext context) - { - throw new InvalidProgramException("Exception Filter threw"); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/ThrowingResultFilter.cs b/test/WebSites/FiltersWebSite/Filters/ThrowingResultFilter.cs deleted file mode 100644 index ca5cfe8635..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/ThrowingResultFilter.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class ThrowingResultFilter : ResultFilterAttribute - { - public override void OnResultExecuting(ResultExecutingContext context) - { - throw new InvalidProgramException("Result Filter threw."); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Filters/TracingResourceFilter.cs b/test/WebSites/FiltersWebSite/Filters/TracingResourceFilter.cs deleted file mode 100644 index 275a3a32ba..0000000000 --- a/test/WebSites/FiltersWebSite/Filters/TracingResourceFilter.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace FiltersWebSite -{ - public class TracingResourceFilter : Attribute, IResourceFilter - { - public TracingResourceFilter(string name) - { - Name = name; - } - - public string Name { get; } - - public void OnResourceExecuted(ResourceExecutedContext context) - { - if (!context.HttpContext.Response.HasStarted) - { - context.HttpContext.Response.Headers.Append( - "filters", - Name + " - OnResourceExecuted"); - } - } - - public void OnResourceExecuting(ResourceExecutingContext context) - { - context.HttpContext.Response.Headers.Append( - "filters", - Name + " - OnResourceExecuting"); - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/FiltersWebSite.csproj b/test/WebSites/FiltersWebSite/FiltersWebSite.csproj deleted file mode 100644 index 7a1ca37d8a..0000000000 --- a/test/WebSites/FiltersWebSite/FiltersWebSite.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - $(StandardTestWebsiteTfms) - - - - - - - - - - - - - diff --git a/test/WebSites/FiltersWebSite/Helper/Helpers.cs b/test/WebSites/FiltersWebSite/Helper/Helpers.cs deleted file mode 100644 index 09bcee1d6e..0000000000 --- a/test/WebSites/FiltersWebSite/Helper/Helpers.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc; -using Microsoft.Net.Http.Headers; - -namespace FiltersWebSite -{ - public static class Helpers - { - public static ContentResult GetContentResult(object result, string message) - { - var actualResult = result as ContentResult; - var content = message; - - if (actualResult != null) - { - content += ", " + actualResult.Content; - } - - return new ContentResult() - { - Content = content, - ContentType = "text/plain", - }; - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Models/DummyClass.cs b/test/WebSites/FiltersWebSite/Models/DummyClass.cs deleted file mode 100644 index d4cc9053e2..0000000000 --- a/test/WebSites/FiltersWebSite/Models/DummyClass.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace FiltersWebSite -{ - public class DummyClass - { - public int SampleInt { get; set; } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Services/DummyService.cs b/test/WebSites/FiltersWebSite/Services/DummyService.cs deleted file mode 100644 index 6c6ee47aed..0000000000 --- a/test/WebSites/FiltersWebSite/Services/DummyService.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace FiltersWebSite -{ - public class DummyService - { - public int RandomNumber - { - get - { - return 4; - } - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Services/RandomNumberService.cs b/test/WebSites/FiltersWebSite/Services/RandomNumberService.cs deleted file mode 100644 index 4b49c0f556..0000000000 --- a/test/WebSites/FiltersWebSite/Services/RandomNumberService.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace FiltersWebSite -{ - public class RandomNumberService - { - public int GetRandamNumber() - { - return 44; - } - } -} \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/Startup.cs b/test/WebSites/FiltersWebSite/Startup.cs deleted file mode 100644 index 1d7c2d651f..0000000000 --- a/test/WebSites/FiltersWebSite/Startup.cs +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; -using System.Security.Claims; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.DependencyInjection; - -namespace FiltersWebSite -{ - public class Startup - { - // Set up application services - public void ConfigureServices(IServiceCollection services) - { - services.AddAuthentication() - .AddScheme("Interactive", _ => { }) - .AddScheme("Api", _ => { }); - services.AddMvc(); - services.AddAuthorization(options => - { - // This policy cannot succeed since the claim is never added - options.AddPolicy("Impossible", policy => - { - policy.AuthenticationSchemes.Add("Interactive"); - policy.RequireClaim("Never"); - }); - options.AddPolicy("Api", policy => - { - policy.AuthenticationSchemes.Add("Api"); - policy.RequireClaim(ClaimTypes.NameIdentifier); - }); - options.AddPolicy("Api-Manager", policy => - { - policy.AuthenticationSchemes.Add("Api"); - policy.Requirements.Add(Operations.Edit); - }); - options.AddPolicy("Interactive", policy => - { - policy.AuthenticationSchemes.Add("Interactive"); - policy.RequireClaim(ClaimTypes.NameIdentifier) - .RequireClaim("Permission", "CanViewPage"); - }); - }); - services.AddSingleton(); - services.AddSingleton(); - services.AddTransient(); - - services.Configure(options => - { - options.Filters.Add(new GlobalExceptionFilter()); - options.Filters.Add(new GlobalActionFilter()); - options.Filters.Add(new GlobalResultFilter()); - options.Filters.Add(new GlobalAuthorizationFilter()); - options.Filters.Add(new TracingResourceFilter("Global Resource Filter")); - }); - } - - public void Configure(IApplicationBuilder app) - { - app.UseMiddleware(); - - app.UseMvcWithDefaultRoute(); - } - - public static void Main(string[] args) - { - var host = new WebHostBuilder() - .UseContentRoot(Directory.GetCurrentDirectory()) - .UseStartup() - .UseKestrel() - .UseIISIntegration() - .Build(); - - host.Run(); - } - } -} - diff --git a/test/WebSites/FiltersWebSite/readme.md b/test/WebSites/FiltersWebSite/readme.md deleted file mode 100644 index 377ff14e9f..0000000000 --- a/test/WebSites/FiltersWebSite/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -FiltersWebSite -=== - -This web site illustrates how to use filters to customize request and response. It shows how filters can be -used at a global, controller or action level and how they can be extended.