< Summary

Information
Class: ProjectTemplate.Web.Authentication.Extensions.AuthorizationServiceExtensions
Assembly: ProjectTemplate.Web
File(s): /home/runner/work/NetCoreApplicationTemplate/NetCoreApplicationTemplate/src/ProjectTemplate.Web/Authentication/Extensions/AuthorizationServiceExtensions.cs
Line coverage
100%
Covered lines: 56
Uncovered lines: 0
Coverable lines: 56
Total lines: 108
Line coverage: 100%
Branch coverage
70%
Covered branches: 7
Total branches: 10
Branch coverage: 70%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddApplicationAuthorization(...)70%1010100%

File(s)

/home/runner/work/NetCoreApplicationTemplate/NetCoreApplicationTemplate/src/ProjectTemplate.Web/Authentication/Extensions/AuthorizationServiceExtensions.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Authorization;
 2using Microsoft.Extensions.Options;
 3using ProjectTemplate.Web.Authentication.Claims;
 4using ProjectTemplate.Web.Authentication.Options;
 5
 6namespace ProjectTemplate.Web.Authentication.Extensions;
 7
 8/// <summary>
 9/// Provides extension methods for registering application authorization services.
 10/// </summary>
 11public static class AuthorizationServiceExtensions
 12{
 13    /// <summary>
 14    /// Adds application authorization services and baseline policies.
 15    /// </summary>
 16    /// <param name="services">The service collection to add authorization services to.</param>
 17    /// <param name="configuration">The application configuration source.</param>
 18    /// <returns>The same <see cref="IServiceCollection"/> instance for chaining.</returns>
 19    public static IServiceCollection AddApplicationAuthorization(
 20        this IServiceCollection services,
 21        IConfiguration configuration)
 22    {
 16023        ArgumentNullException.ThrowIfNull(services);
 16024        ArgumentNullException.ThrowIfNull(configuration);
 25
 16026        ApplicationAuthorizationOptions options = configuration
 16027            .GetSection(ApplicationAuthorizationOptions.SectionName)
 16028            .Get<ApplicationAuthorizationOptions>() ?? new ApplicationAuthorizationOptions();
 29
 16030        string roleClaimType = string.IsNullOrWhiteSpace(options.RoleClaimType)
 16031            ? ApplicationClaimTypes.Role
 16032            : options.RoleClaimType;
 33
 16034        string permissionClaimType = string.IsNullOrWhiteSpace(options.PermissionClaimType)
 16035            ? ApplicationClaimTypes.Permission
 16036            : options.PermissionClaimType;
 37
 16038        services
 16039            .AddOptions<ApplicationAuthorizationOptions>()
 16040            .Bind(configuration.GetSection(ApplicationAuthorizationOptions.SectionName))
 16041            .Validate(
 16042                authorizationOptions =>
 27643                    !authorizationOptions.RequireAuthenticatedUserByDefault ||
 27644                    configuration.GetValue<bool>($"{ApplicationAuthenticationOptions.SectionName}:Enabled"),
 16045                "ProjectTemplate:Authorization:RequireAuthenticatedUserByDefault cannot be true when ProjectTemplate:Aut
 16046            .Validate(
 27647                authorizationOptions => !string.IsNullOrWhiteSpace(authorizationOptions.RoleClaimType),
 16048                "ProjectTemplate:Authorization:RoleClaimType is required.")
 16049            .Validate(
 27650                authorizationOptions => !string.IsNullOrWhiteSpace(authorizationOptions.PermissionClaimType),
 16051                "ProjectTemplate:Authorization:PermissionClaimType is required.")
 16052            .Validate(
 55253                authorizationOptions => authorizationOptions.AdministratorRoles.Any(role => !string.IsNullOrWhiteSpace(r
 16054                "ProjectTemplate:Authorization:AdministratorRoles must contain at least one non-empty value.")
 16055            .Validate(
 55256                authorizationOptions => authorizationOptions.ManageApplicationPermissions.Any(permission => !string.IsNu
 16057                "ProjectTemplate:Authorization:ManageApplicationPermissions must contain at least one non-empty value.")
 16058            .ValidateOnStart();
 59
 16060        services.AddAuthorizationBuilder()
 16061            .AddPolicy(
 16062                ApplicationAuthorizationPolicyNames.AuthenticatedUser,
 14063                policy => policy.RequireAuthenticatedUser())
 16064            .AddPolicy(
 16065                ApplicationAuthorizationPolicyNames.AdministratorRole,
 16066                policy =>
 16067                {
 14068                    policy.RequireAuthenticatedUser();
 14069                    policy.RequireClaim(roleClaimType, options.AdministratorRoles);
 14070                })
 16071            .AddPolicy(
 16072                ApplicationAuthorizationPolicyNames.ManageApplicationPermission,
 16073                policy =>
 16074                {
 14075                    policy.RequireAuthenticatedUser();
 14076                    policy.RequireClaim(permissionClaimType, options.ManageApplicationPermissions);
 30077                });
 78
 16079        services
 16080            .AddOptions<AuthorizationOptions>()
 30081            .Configure<IOptions<ApplicationAuthorizationOptions>>((authorizationOptions, applicationAuthorizationOptions
 30082                    ? new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()
 30083                    : null);
 84
 16085        return services;
 86    }
 87}
 88
 89/// <summary>
 90/// Provides application authorization policy names.
 91/// </summary>
 92public static class ApplicationAuthorizationPolicyNames
 93{
 94    /// <summary>
 95    /// Policy requiring the current user to be authenticated.
 96    /// </summary>
 97    public const string AuthenticatedUser = "application.AuthenticatedUser";
 98
 99    /// <summary>
 100    /// Policy defining the administrator role.
 101    /// </summary>
 102    public const string AdministratorRole = "application.Role.Administrator";
 103
 104    /// <summary>
 105    /// Policy defining the manage application permission.
 106    /// </summary>
 107    public const string ManageApplicationPermission = "application.Permission.ManageApplication";
 108}