Adding AuthorizePage & AuthorizeFolder without requiring a policy

Refactoring
This commit is contained in:
hishamco 2017-03-10 04:55:11 +03:00 committed by Pranav K
parent f7fd5114b3
commit e44d875df4
4 changed files with 90 additions and 6 deletions

View File

@ -61,7 +61,16 @@ namespace Microsoft.Extensions.DependencyInjection
}
/// <summary>
/// Adds a <see cref="AuthorizeFilter"/> with the specified policy to all page under the specified path.
/// Adds a <see cref="AuthorizeFilter"/> to the page with the specified path.
/// </summary>
/// <param name="options">The <see cref="RazorPagesOptions"/> to configure.</param>
/// <param name="path">The path of the Razor Page.</param>
/// <returns>The <see cref="RazorPagesOptions"/>.</returns>
public static RazorPagesOptions AuthorizePage(this RazorPagesOptions options, string path) =>
AuthorizePage(options, path, policy: string.Empty);
/// <summary>
/// Adds a <see cref="AuthorizeFilter"/> with the specified policy to all pages under the specified path.
/// </summary>
/// <param name="options">The <see cref="RazorPagesOptions"/> to configure.</param>
/// <param name="folderPath">The folder path.</param>
@ -84,6 +93,15 @@ namespace Microsoft.Extensions.DependencyInjection
return options;
}
/// <summary>
/// Adds a <see cref="AuthorizeFilter"/> to all pages under the specified path.
/// </summary>
/// <param name="options">The <see cref="RazorPagesOptions"/> to configure.</param>
/// <param name="folderPath">The folder path.</param>
/// <returns>The <see cref="RazorPagesOptions"/>.</returns>
public static RazorPagesOptions AuthorizeFolder(this RazorPagesOptions options, string folderPath) =>
AuthorizeFolder(options, folderPath, policy: string.Empty);
private class PageConvention : IPageApplicationModelConvention
{
private readonly string _path;

View File

@ -38,7 +38,7 @@ namespace Microsoft.Extensions.DependencyInjection
}
[Fact]
public void AuthorizePage_AddsAuthorizeFilterToSpecificPage()
public void AuthorizePage_AddsAuthorizeFilterWithPolicyToSpecificPage()
{
// Arrange
var options = new RazorPagesOptions();
@ -66,10 +66,39 @@ namespace Microsoft.Extensions.DependencyInjection
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<AuthorizeFilter>(Assert.Single(model.Filters));
var authorizeData = Assert.IsType<AuthorizeAttribute>(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 @@ namespace Microsoft.Extensions.DependencyInjection
});
}
[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<AuthorizeFilter>(Assert.Single(model.Filters));
var authorizeData = Assert.IsType<AuthorizeAttribute>(Assert.Single(authorizeFilter.AuthorizeData));
Assert.Equal(string.Empty, authorizeData.Policy);
},
model =>
{
Assert.Equal("/Users/Contact.cshtml", model.ViewEnginePath);
var authorizeFilter = Assert.IsType<AuthorizeFilter>(Assert.Single(model.Filters));
var authorizeData = Assert.IsType<AuthorizeAttribute>(Assert.Single(authorizeFilter.AuthorizeData));
Assert.Equal(string.Empty, authorizeData.Policy);
});
}
private static void ApplyConventions(RazorPagesOptions options, PageApplicationModel[] models)
{
foreach (var convention in options.Conventions)

View File

@ -15,7 +15,7 @@ namespace RazorPagesWebSite
.AddCookieTempDataProvider()
.AddRazorPagesOptions(options =>
{
options.AuthorizePage("/HelloWorldWithAuth", string.Empty);
options.AuthorizePage("/HelloWorldWithAuth");
});
}

View File

@ -16,8 +16,8 @@ namespace RazorPagesWebSite
.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");
});
}