diff --git a/src/Microsoft.AspNetCore.Mvc.RazorPages/DependencyInjection/RazorPagesOptionsExtensions.cs b/src/Microsoft.AspNetCore.Mvc.RazorPages/DependencyInjection/RazorPagesOptionsExtensions.cs index 7723852da9..2448688edb 100644 --- a/src/Microsoft.AspNetCore.Mvc.RazorPages/DependencyInjection/RazorPagesOptionsExtensions.cs +++ b/src/Microsoft.AspNetCore.Mvc.RazorPages/DependencyInjection/RazorPagesOptionsExtensions.cs @@ -61,7 +61,16 @@ public static RazorPagesOptions AuthorizePage(this RazorPagesOptions options, st } /// - /// Adds a with the specified policy to all page under the specified path. + /// Adds a to the page with the specified path. + /// + /// The to configure. + /// The path of the Razor Page. + /// The . + public static RazorPagesOptions AuthorizePage(this RazorPagesOptions options, string path) => + AuthorizePage(options, path, policy: string.Empty); + + /// + /// Adds a with the specified policy to all pages under the specified path. /// /// The to configure. /// The folder path. @@ -84,6 +93,15 @@ public static RazorPagesOptions AuthorizeFolder(this RazorPagesOptions options, return options; } + /// + /// Adds a to all pages under the specified path. + /// + /// The to configure. + /// The folder path. + /// The . + public static RazorPagesOptions AuthorizeFolder(this RazorPagesOptions options, string folderPath) => + AuthorizeFolder(options, folderPath, policy: string.Empty); + private class PageConvention : IPageApplicationModelConvention { private readonly string _path; diff --git a/test/Microsoft.AspNetCore.Mvc.RazorPages.Test/DependencyInjection/RazorPagesOptionsExtensionsTest.cs b/test/Microsoft.AspNetCore.Mvc.RazorPages.Test/DependencyInjection/RazorPagesOptionsExtensionsTest.cs index 6f2bca034c..c1b88b5442 100644 --- a/test/Microsoft.AspNetCore.Mvc.RazorPages.Test/DependencyInjection/RazorPagesOptionsExtensionsTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.RazorPages.Test/DependencyInjection/RazorPagesOptionsExtensionsTest.cs @@ -38,7 +38,7 @@ public void AddFilter_AddsFiltersToAllPages() } [Fact] - public void AuthorizePage_AddsAuthorizeFilterToSpecificPage() + public void AuthorizePage_AddsAuthorizeFilterWithPolicyToSpecificPage() { // Arrange var options = new RazorPagesOptions(); @@ -66,10 +66,39 @@ public void AuthorizePage_AddsAuthorizeFilterToSpecificPage() model => Assert.Empty(model.Filters)); } + [Fact] + public void AuthorizePage_AddsAuthorizeFilterWithoutPolicyToSpecificPage() + { + // Arrange + var options = new RazorPagesOptions(); + var models = new[] + { + new PageApplicationModel("/Pages/Index.cshtml", "/Index.cshtml"), + new PageApplicationModel("/Pages/Users/Account.cshtml", "/Users/Account.cshtml"), + new PageApplicationModel("/Pages/Users/Contact.cshtml", "/Users/Contact.cshtml"), + }; + + // Act + options.AuthorizePage("/Users/Account.cshtml"); + ApplyConventions(options, models); + + // Assert + Assert.Collection(models, + model => Assert.Empty(model.Filters), + model => + { + Assert.Equal("/Users/Account.cshtml", model.ViewEnginePath); + var authorizeFilter = Assert.IsType(Assert.Single(model.Filters)); + var authorizeData = Assert.IsType(Assert.Single(authorizeFilter.AuthorizeData)); + Assert.Equal(string.Empty, authorizeData.Policy); + }, + model => Assert.Empty(model.Filters)); + } + [Theory] [InlineData("/Users")] [InlineData("/Users/")] - public void AuthorizePage_AddsAuthorizeFilterToPagesUnderFolder(string folderName) + public void AuthorizePage_AddsAuthorizeFilterWithPolicyToPagesUnderFolder(string folderName) { // Arrange var options = new RazorPagesOptions(); @@ -103,6 +132,43 @@ public void AuthorizePage_AddsAuthorizeFilterToPagesUnderFolder(string folderNam }); } + [Theory] + [InlineData("/Users")] + [InlineData("/Users/")] + public void AuthorizePage_AddsAuthorizeFilterWithoutPolicyToPagesUnderFolder(string folderName) + { + // Arrange + var options = new RazorPagesOptions(); + var models = new[] + { + new PageApplicationModel("/Pages/Index.cshtml", "/Index.cshtml"), + new PageApplicationModel("/Pages/Users/Account.cshtml", "/Users/Account.cshtml"), + new PageApplicationModel("/Pages/Users/Contact.cshtml", "/Users/Contact.cshtml"), + }; + + // Act + options.AuthorizeFolder(folderName); + ApplyConventions(options, models); + + // Assert + Assert.Collection(models, + model => Assert.Empty(model.Filters), + model => + { + Assert.Equal("/Users/Account.cshtml", model.ViewEnginePath); + var authorizeFilter = Assert.IsType(Assert.Single(model.Filters)); + var authorizeData = Assert.IsType(Assert.Single(authorizeFilter.AuthorizeData)); + Assert.Equal(string.Empty, authorizeData.Policy); + }, + model => + { + Assert.Equal("/Users/Contact.cshtml", model.ViewEnginePath); + var authorizeFilter = Assert.IsType(Assert.Single(model.Filters)); + var authorizeData = Assert.IsType(Assert.Single(authorizeFilter.AuthorizeData)); + Assert.Equal(string.Empty, authorizeData.Policy); + }); + } + private static void ApplyConventions(RazorPagesOptions options, PageApplicationModel[] models) { foreach (var convention in options.Conventions) diff --git a/test/WebSites/RazorPagesWebSite/Startup.cs b/test/WebSites/RazorPagesWebSite/Startup.cs index 1ec471eca4..369d7452a2 100644 --- a/test/WebSites/RazorPagesWebSite/Startup.cs +++ b/test/WebSites/RazorPagesWebSite/Startup.cs @@ -15,7 +15,7 @@ public void ConfigureServices(IServiceCollection services) .AddCookieTempDataProvider() .AddRazorPagesOptions(options => { - options.AuthorizePage("/HelloWorldWithAuth", string.Empty); + options.AuthorizePage("/HelloWorldWithAuth"); }); } diff --git a/test/WebSites/RazorPagesWebSite/StartupWithBasePath.cs b/test/WebSites/RazorPagesWebSite/StartupWithBasePath.cs index 1881cca258..9295f0da80 100644 --- a/test/WebSites/RazorPagesWebSite/StartupWithBasePath.cs +++ b/test/WebSites/RazorPagesWebSite/StartupWithBasePath.cs @@ -16,8 +16,8 @@ public void ConfigureServices(IServiceCollection services) .AddRazorPagesOptions(options => { options.RootDirectory = "/Pages"; - options.AuthorizePage("/Conventions/Auth", string.Empty); - options.AuthorizeFolder("/Conventions/AuthFolder", string.Empty); + options.AuthorizePage("/Conventions/Auth"); + options.AuthorizeFolder("/Conventions/AuthFolder"); }); }