< 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: 57
Uncovered lines: 0
Coverable lines: 57
Total lines: 107
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddApplicationAuthorization(...)100%11100%

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.Options;
 4
 5namespace ProjectTemplate.Web.Authentication.Extensions;
 6
 7/// <summary>
 8/// Provides extension methods for registering application authorization services.
 9/// </summary>
 10public static class AuthorizationServiceExtensions
 11{
 12    /// <summary>
 13    /// Adds application authorization services and baseline policies.
 14    /// </summary>
 15    /// <param name="services">The service collection to add authorization services to.</param>
 16    /// <param name="configuration">The application configuration source.</param>
 17    /// <returns>The same <see cref="IServiceCollection"/> instance for chaining.</returns>
 18    public static IServiceCollection AddApplicationAuthorization(
 19        this IServiceCollection services,
 20        IConfiguration configuration)
 21    {
 11022        ArgumentNullException.ThrowIfNull(services);
 11023        ArgumentNullException.ThrowIfNull(configuration);
 24
 11025        services
 11026            .AddOptions<ApplicationAuthorizationOptions>()
 11027            .Bind(configuration.GetSection(ApplicationAuthorizationOptions.SectionName))
 11028            .Validate(
 11029                authorizationOptions =>
 11030                    !authorizationOptions.RequireAuthenticatedUserByDefault ||
 11031                    configuration.GetValue<bool>($"{ApplicationAuthenticationOptions.SectionName}:Enabled"),
 11032                "ProjectTemplate:Authorization:RequireAuthenticatedUserByDefault cannot be true when ProjectTemplate:Aut
 11033            .Validate(
 11034                authorizationOptions => !string.IsNullOrWhiteSpace(authorizationOptions.RoleClaimType),
 11035                "ProjectTemplate:Authorization:RoleClaimType is required.")
 11036            .Validate(
 11037                authorizationOptions => !string.IsNullOrWhiteSpace(authorizationOptions.PermissionClaimType),
 11038                "ProjectTemplate:Authorization:PermissionClaimType is required.")
 11039            .Validate(
 11040                authorizationOptions => authorizationOptions.AdministratorRoles.Any(role => !string.IsNullOrWhiteSpace(r
 11041                "ProjectTemplate:Authorization:AdministratorRoles must contain at least one non-empty value.")
 11042            .Validate(
 11043                authorizationOptions => authorizationOptions.ManageApplicationPermissions.Any(permission => !string.IsNu
 11044                "ProjectTemplate:Authorization:ManageApplicationPermissions must contain at least one non-empty value.")
 11045            .ValidateOnStart();
 46
 11047        _ = services.AddAuthorization();
 48
 49        // Build every policy from the bound and validated ApplicationAuthorizationOptions instance, so the
 50        // policies and the validators above always see the same values.
 11051        services
 11052            .AddOptions<AuthorizationOptions>()
 11053            .Configure<IOptions<ApplicationAuthorizationOptions>>((authorizationOptions, applicationAuthorizationOptions
 11054            {
 11055                ApplicationAuthorizationOptions applicationAuthorizationOptions = applicationAuthorizationOptionsAccesso
 11056
 11057                authorizationOptions.AddPolicy(
 11058                    ApplicationAuthorizationPolicyNames.AuthenticatedUser,
 11059                    policy => policy.RequireAuthenticatedUser());
 11060                authorizationOptions.AddPolicy(
 11061                    ApplicationAuthorizationPolicyNames.AdministratorRole,
 11062                    policy =>
 11063                    {
 11064                        policy.RequireAuthenticatedUser();
 11065                        policy.RequireClaim(
 11066                            applicationAuthorizationOptions.RoleClaimType,
 11067                            applicationAuthorizationOptions.AdministratorRoles);
 11068                    });
 11069                authorizationOptions.AddPolicy(
 11070                    ApplicationAuthorizationPolicyNames.ManageApplicationPermission,
 11071                    policy =>
 11072                    {
 11073                        policy.RequireAuthenticatedUser();
 11074                        policy.RequireClaim(
 11075                            applicationAuthorizationOptions.PermissionClaimType,
 11076                            applicationAuthorizationOptions.ManageApplicationPermissions);
 11077                    });
 11078
 11079                authorizationOptions.FallbackPolicy = applicationAuthorizationOptions.RequireAuthenticatedUserByDefault
 11080                    ? new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()
 11081                    : null;
 11082            });
 83
 11084        return services;
 85    }
 86}
 87
 88/// <summary>
 89/// Provides application authorization policy names.
 90/// </summary>
 91public static class ApplicationAuthorizationPolicyNames
 92{
 93    /// <summary>
 94    /// Policy requiring the current user to be authenticated.
 95    /// </summary>
 96    public const string AuthenticatedUser = "application.AuthenticatedUser";
 97
 98    /// <summary>
 99    /// Policy defining the administrator role.
 100    /// </summary>
 101    public const string AdministratorRole = "application.Role.Administrator";
 102
 103    /// <summary>
 104    /// Policy defining the manage application permission.
 105    /// </summary>
 106    public const string ManageApplicationPermission = "application.Permission.ManageApplication";
 107}