Skip to content

Commit

Permalink
Re-factored service configuration.
Browse files Browse the repository at this point in the history
  • Loading branch information
mgernand committed May 4, 2022
1 parent 2d4a007 commit cca26b3
Show file tree
Hide file tree
Showing 14 changed files with 151 additions and 149 deletions.
6 changes: 2 additions & 4 deletions samples/SamplePermissions/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,7 @@
builder.Services.AddRazorPages();

builder.Services.AddAuthorization();
builder.Services.AddPermissionsAuthorization(options =>
{
options.AddIdentityClaimsProvider();
});
builder.Services.AddPermissionsAuthorization();

builder.Services
.AddAuthentication(IdentityConstants.ApplicationScheme)
Expand All @@ -42,6 +39,7 @@
})
.AddDefaultUI()
.AddDefaultTokenProviders()
.AddIdentityClaimsProvider()
.AddPermissionsEntityFrameworkStores<ApplicationDbContext>();

WebApplication app = builder.Build();
Expand Down
6 changes: 2 additions & 4 deletions samples/SampleTenant/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,7 @@
builder.Services.AddRazorPages();

builder.Services.AddAuthorization();
builder.Services.AddPermissionsAuthorization(options =>
{
options.AddIdentityClaimsProvider();
});
builder.Services.AddPermissionsAuthorization();

builder.Services
.AddAuthentication(IdentityConstants.ApplicationScheme)
Expand All @@ -42,6 +39,7 @@
})
.AddDefaultUI()
.AddDefaultTokenProviders()
.AddIdentityClaimsProvider()
.AddPermissionsEntityFrameworkStores<ApplicationDbContext, HttpContextUserTenantProvider>();

WebApplication app = builder.Build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
<PackageId>MadEyeMatt.$(AssemblyName)</PackageId>
<IncludeSymbols>false</IncludeSymbols>
<Copyright>Copyright © 2022 Matthias Gernand. All rights reserved.</Copyright>
<Version>6.0.1</Version>
<AssemblyVersion>6.0.1</AssemblyVersion>
<FileVersion>6.0.1</FileVersion>
<Version>6.0.2</Version>
<AssemblyVersion>6.0.2</AssemblyVersion>
<FileVersion>6.0.2</FileVersion>
<Authors>Matthias Gernand</Authors>
<Description>A libary that adds permission-based authorization.</Description>
<NeutralLanguage>en</NeutralLanguage>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
<PackageId>MadEyeMatt.$(AssemblyName)</PackageId>
<IncludeSymbols>false</IncludeSymbols>
<Copyright>Copyright © 2022 Matthias Gernand. All rights reserved.</Copyright>
<Version>6.0.1</Version>
<AssemblyVersion>6.0.1</AssemblyVersion>
<FileVersion>6.0.1</FileVersion>
<Version>6.0.2</Version>
<AssemblyVersion>6.0.2</AssemblyVersion>
<FileVersion>6.0.2</FileVersion>
<Authors>Matthias Gernand</Authors>
<Description>A libary that adds permission-based authorization.</Description>
<NeutralLanguage>en</NeutralLanguage>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
<PackageId>MadEyeMatt.$(AssemblyName)</PackageId>
<IncludeSymbols>false</IncludeSymbols>
<Copyright>Copyright © 2022 Matthias Gernand. All rights reserved.</Copyright>
<Version>6.0.1</Version>
<AssemblyVersion>6.0.1</AssemblyVersion>
<FileVersion>6.0.1</FileVersion>
<Version>6.0.2</Version>
<AssemblyVersion>6.0.2</AssemblyVersion>
<FileVersion>6.0.2</FileVersion>
<Authors>Matthias Gernand</Authors>
<Description>A libary that adds permission-based authorization.</Description>
<NeutralLanguage>en</NeutralLanguage>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
namespace AspNetCore.Authorization.Permissions.Identity
{
using System;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Identity;

/// <summary>
/// Extension methods for the <see cref="IdentityBuilderExtensions" /> type.
/// </summary>
[PublicAPI]
public static class IdentityBuilderExtensions
{
/// <summary>
/// Adds the claims provider for the identity library.
/// </summary>
/// <param name="builder"></param>
/// <returns></returns>
public static IdentityBuilder AddIdentityClaimsProvider(this IdentityBuilder builder)
{
return builder.AddIdentityClaimsProvider<PermissionsIdentityUser, PermissionsIdentityPermission, PermissionsIdentityTenant>();
}

/// <summary>
/// Adds the claims provider for the identity library.
/// </summary>
/// <param name="builder"></param>
/// <returns></returns>
public static IdentityBuilder AddIdentityClaimsProvider<TUser>(this IdentityBuilder builder)
where TUser : class, IUser
{
return builder.AddIdentityClaimsProvider<TUser, PermissionsIdentityPermission, PermissionsIdentityTenant>();
}

/// <summary>
/// Adds the claims provider for the identity library.
/// </summary>
/// <param name="builder"></param>
/// <returns></returns>
public static IdentityBuilder AddIdentityClaimsProvider<TUser, TPermission>(this IdentityBuilder builder)
where TUser : class, IUser
where TPermission : class, IPermission
{
return builder.AddIdentityClaimsProvider<TUser, TPermission, PermissionsIdentityTenant>();
}

/// <summary>
/// Adds the claims provider for the identity library.
/// </summary>
/// <param name="builder"></param>
/// <returns></returns>
public static IdentityBuilder AddIdentityClaimsProvider<TUser, TPermission, TTenant>(this IdentityBuilder builder)
where TUser : class, IUser
where TPermission : class, IPermission
where TTenant : class, ITenant
{
Type identityClaimsProviderType = typeof(IdentityClaimsProvider<,,>)
.MakeGenericType(typeof(TUser), typeof(TPermission), typeof(TTenant));

builder.Services.AddClaimsProvider(identityClaimsProviderType);

return builder;
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
<PackageId>MadEyeMatt.$(AssemblyName)</PackageId>
<IncludeSymbols>false</IncludeSymbols>
<Copyright>Copyright © 2022 Matthias Gernand. All rights reserved.</Copyright>
<Version>6.0.1</Version>
<AssemblyVersion>6.0.1</AssemblyVersion>
<FileVersion>6.0.1</FileVersion>
<Version>6.0.2</Version>
<AssemblyVersion>6.0.2</AssemblyVersion>
<FileVersion>6.0.2</FileVersion>
<Authors>Matthias Gernand</Authors>
<Description>A libary that adds permission-based authorization.</Description>
<NeutralLanguage>en</NeutralLanguage>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,50 +1,12 @@
namespace AspNetCore.Authorization.Permissions
{
using System;
using AspNetCore.Authorization.Permissions.Abstractions;
using Fluxera.Guards;
using Fluxera.Utilities.Extensions;
using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;

/// <summary>
/// The options for the permission authorization.
/// </summary>
[PublicAPI]
public sealed class PermissionsAuthenticationOptions
{
private readonly IServiceCollection services;

/// <summary>
/// Creates a new instance of the <see cref="PermissionsAuthenticationOptions" /> type.
/// </summary>
/// <param name="services"></param>
public PermissionsAuthenticationOptions(IServiceCollection services)
{
this.services = services;
}

/// <summary>
/// Adds the given claims provider type.
/// </summary>
/// <typeparam name="TProvider"></typeparam>
/// <returns></returns>
public void AddClaimsProvider<TProvider>() where TProvider : class, IClaimsProvider
{
this.services.AddScoped<IClaimsProvider, TProvider>();
}

/// <summary>
/// Adds the given claims provider type.
/// </summary>
/// <param name="claimsProviderType"></param>
/// <returns></returns>
public void AddClaimsProvider(Type claimsProviderType)
{
Guard.Against.False(claimsProviderType.Implements<IClaimsProvider>(), nameof(claimsProviderType),
"The claims provider type must implement the IClaimsProvider contract.");

this.services.AddScoped(typeof(IClaimsProvider), claimsProviderType);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using System;
using AspNetCore.Authorization.Permissions.Abstractions;
using Fluxera.Extensions.DependencyInjection;
using Fluxera.Guards;
using Fluxera.Utilities.Extensions;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
Expand All @@ -19,17 +21,52 @@ public static class ServiceCollectionExtensions
/// <param name="services"></param>
/// <param name="configureAction"></param>
/// <returns></returns>
public static IServiceCollection AddPermissionsAuthorization(this IServiceCollection services, Action<PermissionsAuthenticationOptions> configureAction)
public static IServiceCollection AddPermissionsAuthorization(this IServiceCollection services, Action<PermissionsAuthenticationOptions> configureAction = null)
{
services.AddAuthorization();
services.AddSingleton<IAuthorizationPolicyProvider, AuthorizationPolicyProvider>();
services.AddSingleton<IAuthorizationHandler, PermissionPolicyHandler>();
services.AddTransient<IUserPermissionsService, UserPermissionsService>();
services.AddTransient<IPermissionLookupNormalizer, UpperInvariantPermissionLookupNormalizer>();

PermissionsAuthenticationOptions options = new PermissionsAuthenticationOptions(services);
PermissionsAuthenticationOptions options = new PermissionsAuthenticationOptions();
configureAction?.Invoke(options);

return services;
}

/// <summary>
/// Adds the given claims provider type.
/// </summary>
/// <param name="services"></param>
/// <typeparam name="TProvider"></typeparam>
/// <returns></returns>
public static IServiceCollection AddClaimsProvider<TProvider>(this IServiceCollection services)
where TProvider : class, IClaimsProvider
{
return services
.AddScoped<IClaimsProvider, TProvider>()
.AddClaimsProviderDecorator();
}

/// <summary>
/// Adds the given claims provider type.
/// </summary>
/// <param name="services"></param>
/// <param name="claimsProviderType"></param>
/// <returns></returns>
public static IServiceCollection AddClaimsProvider(this IServiceCollection services, Type claimsProviderType)
{
Guard.Against.False(claimsProviderType.Implements<IClaimsProvider>(), nameof(claimsProviderType),
"The claims provider type must implement the IClaimsProvider contract.");

return services
.AddScoped(typeof(IClaimsProvider), claimsProviderType)
.AddClaimsProviderDecorator();
}

private static IServiceCollection AddClaimsProviderDecorator(this IServiceCollection services)
{
// Decorate the registered claims provider with an internal one
// that checks the provided claims for correctness.
services
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,8 @@ public async Task<IReadOnlyCollection<Claim>> GetPermissionClaimsForUserAsync(st
public async Task ShouldGetPolicyForPermission()
{
IServiceCollection services = new ServiceCollection();
services.AddPermissionsAuthorization(builder =>
{
builder.AddClaimsProvider<TestClaimsProvider>();
});
services.AddPermissionsAuthorization();
services.AddClaimsProvider<TestClaimsProvider>();
services.Configure<AuthorizationOptions>(options =>
{
});
Expand All @@ -48,10 +46,8 @@ public async Task ShouldGetPolicyForPermission()
public async Task ShouldThrowArgumentException()
{
IServiceCollection services = new ServiceCollection();
services.AddPermissionsAuthorization(builder =>
{
builder.AddClaimsProvider<TestClaimsProvider>();
});
services.AddPermissionsAuthorization();
services.AddClaimsProvider<TestClaimsProvider>();
services.Configure<AuthorizationOptions>(options =>
{
});
Expand All @@ -68,10 +64,8 @@ public async Task ShouldThrowArgumentException()
public async Task ShouldThrowArgumentNullException()
{
IServiceCollection services = new ServiceCollection();
services.AddPermissionsAuthorization(builder =>
{
builder.AddClaimsProvider<TestClaimsProvider>();
});
services.AddPermissionsAuthorization();
services.AddClaimsProvider<TestClaimsProvider>();
services.Configure<AuthorizationOptions>(options =>
{
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,8 @@ public async Task<IReadOnlyCollection<Claim>> GetPermissionClaimsForUserAsync(st
public async Task ShouldAddClaimsToPrincipal(Type claimProviderType, int expectedCount = 3, bool hasTenant = false)
{
IServiceCollection services = new ServiceCollection();
services.AddPermissionsAuthorization(builder =>
{
builder.AddClaimsProvider(claimProviderType);
});
services.AddPermissionsAuthorization();
services.AddClaimsProvider(claimProviderType);
ServiceProvider serviceProvider = services.BuildServiceProvider();

IClaimsProvider service = serviceProvider.GetRequiredService<IClaimsProvider>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,8 @@ public static IEnumerable<object[]> TestCases()
public void ShouldNormalizeName(string inout, string expected)
{
IServiceCollection services = new ServiceCollection();
services.AddPermissionsAuthorization(builder =>
{
builder.AddClaimsProvider<TestClaimsProvider>();
});
services.AddPermissionsAuthorization();
services.AddClaimsProvider<TestClaimsProvider>();
ServiceProvider serviceProvider = services.BuildServiceProvider();

IPermissionLookupNormalizer service = serviceProvider.GetRequiredService<IPermissionLookupNormalizer>();
Expand Down
Loading

0 comments on commit cca26b3

Please sign in to comment.