diff --git a/src/ActiveDirectoryToRestApi/Authentication/ApiKeyAuthFilter.cs b/src/ActiveDirectoryToRestApi/Authentication/ApiKeyAuthFilter.cs new file mode 100644 index 0000000..5fafb6d --- /dev/null +++ b/src/ActiveDirectoryToRestApi/Authentication/ApiKeyAuthFilter.cs @@ -0,0 +1,31 @@ +namespace ActiveDirectoryToRestApi.Authentication; + +public class ApiKeyAuthFilter : IAuthorizationFilter +{ + private readonly Configuration _configuration; + + public ApiKeyAuthFilter(IConfiguration configuration) + { + _configuration = configuration.GetSection(nameof(Configuration)).Get(); + } + + public void OnAuthorization(AuthorizationFilterContext context) + { + if (_configuration.AuthEnabled) + { + if (!context.HttpContext.Request.Headers.TryGetValue("Authorization", out var extractedAuthToken)) + { + context.Result = new UnauthorizedObjectResult("Authorization token was not provided"); + return; + } + + var authToken = _configuration.Authorization; + + if (!authToken.Equals(extractedAuthToken)) + { + context.Result = new UnauthorizedObjectResult("Unauthorized client"); + return; + } + } + } +} \ No newline at end of file diff --git a/src/ActiveDirectoryToRestApi/Configurations/Configuration.cs b/src/ActiveDirectoryToRestApi/Configurations/Configuration.cs new file mode 100644 index 0000000..dc098b9 --- /dev/null +++ b/src/ActiveDirectoryToRestApi/Configurations/Configuration.cs @@ -0,0 +1,7 @@ +namespace ActiveDirectoryToRestApi.Configurations; + +public class Configuration +{ + public string Authorization { get; set; } + public bool AuthEnabled { get; set; } +} diff --git a/src/ActiveDirectoryToRestApi/Controllers/GroupController.cs b/src/ActiveDirectoryToRestApi/Controllers/GroupController.cs index 10a0b70..e59d2cc 100644 --- a/src/ActiveDirectoryToRestApi/Controllers/GroupController.cs +++ b/src/ActiveDirectoryToRestApi/Controllers/GroupController.cs @@ -2,6 +2,7 @@ namespace ActiveDirectoryToRestApi.Controllers; [ApiController] [Route("[controller]")] +[ServiceFilter(typeof(ApiKeyAuthFilter))] public class GroupController : ControllerBase { private readonly ILogger _logger; diff --git a/src/ActiveDirectoryToRestApi/Controllers/UserController.cs b/src/ActiveDirectoryToRestApi/Controllers/UserController.cs index e450c5c..b9bcf29 100644 --- a/src/ActiveDirectoryToRestApi/Controllers/UserController.cs +++ b/src/ActiveDirectoryToRestApi/Controllers/UserController.cs @@ -2,6 +2,7 @@ namespace ActiveDirectoryToRestApi.Controllers; [ApiController] [Route("[controller]")] +[ServiceFilter(typeof(ApiKeyAuthFilter))] public class UserController : ControllerBase { private readonly ILogger _logger; diff --git a/src/ActiveDirectoryToRestApi/GlobalUsings.cs b/src/ActiveDirectoryToRestApi/GlobalUsings.cs index 368e045..1b3ae75 100644 --- a/src/ActiveDirectoryToRestApi/GlobalUsings.cs +++ b/src/ActiveDirectoryToRestApi/GlobalUsings.cs @@ -1,8 +1,11 @@ -global using ActiveDirectoryToRestApi.Configurations; +global using ActiveDirectoryToRestApi.Authentication; +global using ActiveDirectoryToRestApi.Configurations; global using ActiveDirectoryToRestApi.Extensions; global using ActiveDirectoryToRestApi.Models; global using ActiveDirectoryToRestApi.Services; global using Microsoft.AspNetCore.Mvc; +global using Microsoft.AspNetCore.Mvc.Filters; +global using Microsoft.OpenApi.Models; global using System.ComponentModel; global using System.ComponentModel.DataAnnotations; global using System.DirectoryServices.Protocols; diff --git a/src/ActiveDirectoryToRestApi/Program.cs b/src/ActiveDirectoryToRestApi/Program.cs index 5b2000a..26fb5ee 100644 --- a/src/ActiveDirectoryToRestApi/Program.cs +++ b/src/ActiveDirectoryToRestApi/Program.cs @@ -2,7 +2,31 @@ var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); -builder.Services.AddSwaggerGen(); +builder.Services.AddSwaggerGen(s => +{ + s.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme + { + Description = "Enter the token with the `Bearer` prefix, e.g. \"Bearer a1b2c3d4\"", + Type = SecuritySchemeType.ApiKey, + Name = "Authorization", + In = ParameterLocation.Header, + Scheme = "ApiKeyScheme", + }); + var scheme = new OpenApiSecurityScheme + { + Reference = new OpenApiReference + { + Type = ReferenceType.SecurityScheme, + Id = "Bearer" + }, + In = ParameterLocation.Header + }; + var requirement = new OpenApiSecurityRequirement + { + { scheme, new List() } + }; + s.AddSecurityRequirement(requirement); +}); builder.Services.AddSingleton(provider => { var configs = builder.Configuration.GetSection(nameof(LdapConfigs)).Get(); @@ -18,6 +42,7 @@ builder.Services.AddSingleton(provider => }); builder.Services.AddSingleton(); builder.Services.AddTransient(); +builder.Services.AddScoped(); var app = builder.Build(); diff --git a/src/ActiveDirectoryToRestApi/appsettings.json b/src/ActiveDirectoryToRestApi/appsettings.json index 49ba635..e5cb290 100644 --- a/src/ActiveDirectoryToRestApi/appsettings.json +++ b/src/ActiveDirectoryToRestApi/appsettings.json @@ -12,5 +12,9 @@ "User": "ldapAdmin", "Pass": "Thi$1sMyPassw0rd", "DistinguishedName": "DC=ad,DC=zimbres,DC=com" + }, + "Configuration": { + "Authorization": "Bearer v63M9FlOhqAohJ7oGmFrhVIj", + "AuthEnabled": "false" } }