Skip to content

Commit ba0171c

Browse files
committed
(#290) Authorization Policy Provider
1 parent fee8da7 commit ba0171c

File tree

62 files changed

+396
-480
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+396
-480
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using ClassifiedAds.Infrastructure.Web.Authorization.Requirements;
2+
using Microsoft.AspNetCore.Authorization;
3+
using Microsoft.Extensions.Options;
4+
using System;
5+
using System.Threading.Tasks;
6+
7+
namespace ClassifiedAds.Infrastructure.Web.Authorization.Policies;
8+
9+
internal class CustomAuthorizationPolicyProvider : DefaultAuthorizationPolicyProvider
10+
{
11+
public CustomAuthorizationPolicyProvider(IOptions<AuthorizationOptions> options)
12+
: base(options)
13+
{
14+
}
15+
16+
public override Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
17+
{
18+
if (policyName.StartsWith("Permission:", StringComparison.InvariantCultureIgnoreCase))
19+
{
20+
var policyBuilder = new AuthorizationPolicyBuilder();
21+
22+
policyBuilder.RequireAuthenticatedUser();
23+
24+
policyBuilder.AddRequirements(new PermissionRequirement
25+
{
26+
PermissionName = policyName
27+
});
28+
29+
var policy = policyBuilder.Build();
30+
31+
return Task.FromResult(policy);
32+
}
33+
34+
return base.GetPolicyAsync(policyName);
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,30 @@
1-
using ClassifiedAds.Infrastructure.Web.Authorization.Requirements;
1+
using ClassifiedAds.Infrastructure.Web.Authorization.Policies;
2+
using ClassifiedAds.Infrastructure.Web.Authorization.Requirements;
23
using ClassifiedAds.Infrastructure.Web.ClaimsTransformations;
34
using Microsoft.AspNetCore.Authentication;
45
using Microsoft.AspNetCore.Authorization;
56
using System;
6-
using System.Collections.Generic;
77
using System.Linq;
88
using System.Reflection;
99

1010
namespace Microsoft.Extensions.DependencyInjection;
1111

12-
public static class PolicyServiceCollectionExtensions
12+
public static class ServiceCollectionExtensions
1313
{
14-
public static IServiceCollection AddAuthorizationPolicies(this IServiceCollection services, Assembly assembly, IEnumerable<string> policies)
14+
public static IServiceCollection AddAuthorizationPolicies(this IServiceCollection services, Assembly assembly)
1515
{
1616
if (!services.Any(s => s.ServiceType == typeof(IClaimsTransformation) && s.ImplementationType == typeof(CustomClaimsTransformation)))
1717
{
1818
services.AddSingleton<IClaimsTransformation, CustomClaimsTransformation>();
1919
}
2020

21+
if (!services.Any(s => s.ServiceType == typeof(IAuthorizationPolicyProvider) && s.ImplementationType == typeof(CustomAuthorizationPolicyProvider)))
22+
{
23+
services.AddSingleton<IAuthorizationPolicyProvider, CustomAuthorizationPolicyProvider>();
24+
}
25+
2126
services.Configure<AuthorizationOptions>(options =>
2227
{
23-
foreach (var policyName in policies)
24-
{
25-
options.AddPolicy(policyName, policy =>
26-
{
27-
policy.AddRequirements(new PermissionRequirement
28-
{
29-
PermissionName = policyName
30-
});
31-
});
32-
}
3328
});
3429

3530
if (!services.Any(s => s.ServiceType == typeof(IAuthorizationHandler) && s.ImplementationType == typeof(PermissionRequirementHandler)))

src/Microservices/Services.AuditLog/ClassifiedAds.Services.AuditLog.Api/Controllers/AuditLogEntriesController.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ public AuditLogEntriesController(Dispatcher dispatcher)
2727
}
2828

2929
[EnableRateLimiting(RateLimiterPolicyNames.GetAuditLogsPolicy)]
30-
[Authorize(AuthorizationPolicyNames.GetAuditLogsPolicy)]
30+
[Authorize(Permissions.GetAuditLogs)]
3131
[HttpGet]
3232
public async Task<ActionResult<IEnumerable<AuditLogEntryDTO>>> Get()
3333
{
3434
var logs = await _dispatcher.DispatchAsync(new GetAuditEntriesQuery { });
3535
return Ok(logs);
3636
}
3737

38-
[Authorize(AuthorizationPolicyNames.GetAuditLogsPolicy)]
38+
[Authorize(Permissions.GetAuditLogs)]
3939
[HttpGet("paged")]
4040
public async Task<ActionResult<Paged<AuditLogEntryDTO>>> GetPaged(int page, int pageSize)
4141
{

src/Microservices/Services.AuditLog/ClassifiedAds.Services.AuditLog/Authorization/AuthorizationPolicyNames.cs

-13
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace ClassifiedAds.Services.AuditLog.Authorization;
2+
3+
public static class Permissions
4+
{
5+
public const string GetAuditLogs = "Permission:GetAuditLogs";
6+
}

src/Microservices/Services.AuditLog/ClassifiedAds.Services.AuditLog/ServiceCollectionExtensions.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using ClassifiedAds.Domain.Infrastructure.MessageBrokers;
22
using ClassifiedAds.Domain.Repositories;
33
using ClassifiedAds.Infrastructure.HostedServices;
4-
using ClassifiedAds.Services.AuditLog.Authorization;
54
using ClassifiedAds.Services.AuditLog.ConfigurationOptions;
65
using ClassifiedAds.Services.AuditLog.DTOs;
76
using ClassifiedAds.Services.AuditLog.Entities;
@@ -31,7 +30,7 @@ public static IServiceCollection AddAuditLogModule(this IServiceCollection servi
3130

3231
services.AddMessageHandlers(Assembly.GetExecutingAssembly());
3332

34-
services.AddAuthorizationPolicies(Assembly.GetExecutingAssembly(), AuthorizationPolicyNames.GetPolicyNames());
33+
services.AddAuthorizationPolicies(Assembly.GetExecutingAssembly());
3534

3635
services.AddTransient<IMessageBus, MessageBus>()
3736
.AddMessageBusReceiver<AuditLogAggregationConsumer, AuditLogCreatedEvent>(appSettings.MessageBroker);

src/Microservices/Services.Configuration/ClassifiedAds.Services.Configuration.Api/Authorization/AuthorizationPolicyNames.cs

-21
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace ClassifiedAds.Services.Configuration.Authorization;
2+
3+
public static class Permissions
4+
{
5+
public const string GetConfigurationEntries = "Permission:GetConfigurationEntries";
6+
public const string GetConfigurationEntry = "Permission:GetConfigurationEntry";
7+
public const string AddConfigurationEntry = "Permission:AddConfigurationEntry";
8+
public const string UpdateConfigurationEntry = "Permission:UpdateConfigurationEntry";
9+
public const string DeleteConfigurationEntry = "Permission:DeleteConfigurationEntry";
10+
}

src/Microservices/Services.Configuration/ClassifiedAds.Services.Configuration.Api/Controllers/ConfigurationEntriesController.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public ConfigurationEntriesController(Dispatcher dispatcher,
4646
_configurationEntriesExcelReader = configurationEntriesExcelReader;
4747
}
4848

49-
[Authorize(AuthorizationPolicyNames.GetConfigurationEntriesPolicy)]
49+
[Authorize(Permissions.GetConfigurationEntries)]
5050
[HttpGet]
5151
public async Task<ActionResult<IEnumerable<ConfigurationEntryModel>>> Get()
5252
{
@@ -55,7 +55,7 @@ public async Task<ActionResult<IEnumerable<ConfigurationEntryModel>>> Get()
5555
return Ok(model);
5656
}
5757

58-
[Authorize(AuthorizationPolicyNames.GetConfigurationEntryPolicy)]
58+
[Authorize(Permissions.GetConfigurationEntry)]
5959
[HttpGet("{id}")]
6060
[ProducesResponseType(StatusCodes.Status200OK)]
6161
[ProducesResponseType(StatusCodes.Status404NotFound)]
@@ -66,7 +66,7 @@ public async Task<ActionResult<ConfigurationEntryModel>> Get(Guid id)
6666
return Ok(model);
6767
}
6868

69-
[Authorize(AuthorizationPolicyNames.AddConfigurationEntryPolicy)]
69+
[Authorize(Permissions.AddConfigurationEntry)]
7070
[HttpPost]
7171
[Consumes("application/json")]
7272
[ProducesResponseType(StatusCodes.Status201Created)]
@@ -86,7 +86,7 @@ public async Task<ActionResult<ConfigurationEntryModel>> Post([FromBody] Configu
8686
return Created($"/api/ConfigurationEntries/{model.Id}", model);
8787
}
8888

89-
[Authorize(AuthorizationPolicyNames.UpdateConfigurationEntryPolicy)]
89+
[Authorize(Permissions.UpdateConfigurationEntry)]
9090
[HttpPut("{id}")]
9191
[Consumes("application/json")]
9292
[ProducesResponseType(StatusCodes.Status200OK)]
@@ -114,7 +114,7 @@ public async Task<ActionResult> Put(Guid id, [FromBody] ConfigurationEntryModel
114114
return Ok(model);
115115
}
116116

117-
[Authorize(AuthorizationPolicyNames.DeleteConfigurationEntryPolicy)]
117+
[Authorize(Permissions.DeleteConfigurationEntry)]
118118
[HttpDelete("{id}")]
119119
[ProducesResponseType(StatusCodes.Status200OK)]
120120
[ProducesResponseType(StatusCodes.Status404NotFound)]

src/Microservices/Services.Configuration/ClassifiedAds.Services.Configuration.Api/ServiceCollectionExtensions.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using ClassifiedAds.CrossCuttingConcerns.Excel;
22
using ClassifiedAds.Domain.Repositories;
3-
using ClassifiedAds.Services.Configuration.Authorization;
43
using ClassifiedAds.Services.Configuration.ConfigurationOptions;
54
using ClassifiedAds.Services.Configuration.Entities;
65
using ClassifiedAds.Services.Configuration.Excel;
@@ -30,7 +29,7 @@ public static IServiceCollection AddConfigurationModule(this IServiceCollection
3029

3130
services.AddMessageHandlers(Assembly.GetExecutingAssembly());
3231

33-
services.AddAuthorizationPolicies(Assembly.GetExecutingAssembly(), AuthorizationPolicyNames.GetPolicyNames());
32+
services.AddAuthorizationPolicies(Assembly.GetExecutingAssembly());
3433

3534
services.AddScoped<IExcelReader<ImportConfigurationEntriesFromExcel>, ImportConfigurationEntriesFromExcelHandler>();
3635
services.AddScoped<IExcelWriter<ExportConfigurationEntriesToExcel>, ExportConfigurationEntriesToExcelHandler>();

src/Microservices/Services.Identity/ClassifiedAds.Services.Identity.Api/Controllers/RolesController.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public RolesController(Dispatcher dispatcher, ILogger<RolesController> logger)
2727
_dispatcher = dispatcher;
2828
}
2929

30-
[Authorize(AuthorizationPolicyNames.GetRolesPolicy)]
30+
[Authorize(Permissions.GetRoles)]
3131
[HttpGet]
3232
public async Task<ActionResult<IEnumerable<Role>>> Get()
3333
{
@@ -36,7 +36,7 @@ public async Task<ActionResult<IEnumerable<Role>>> Get()
3636
return Ok(model);
3737
}
3838

39-
[Authorize(AuthorizationPolicyNames.GetRolePolicy)]
39+
[Authorize(Permissions.GetRole)]
4040
[HttpGet("{id}")]
4141
[ProducesResponseType(StatusCodes.Status200OK)]
4242
[ProducesResponseType(StatusCodes.Status404NotFound)]
@@ -47,7 +47,7 @@ public async Task<ActionResult<Role>> Get(Guid id)
4747
return Ok(model);
4848
}
4949

50-
[Authorize(AuthorizationPolicyNames.AddRolePolicy)]
50+
[Authorize(Permissions.AddRole)]
5151
[HttpPost]
5252
[Consumes("application/json")]
5353
[ProducesResponseType(StatusCodes.Status201Created)]
@@ -66,7 +66,7 @@ public async Task<ActionResult<Role>> Post([FromBody] RoleModel model)
6666
return Created($"/api/roles/{model.Id}", model);
6767
}
6868

69-
[Authorize(AuthorizationPolicyNames.UpdateRolePolicy)]
69+
[Authorize(Permissions.UpdateRole)]
7070
[HttpPut("{id}")]
7171
[Consumes("application/json")]
7272
[ProducesResponseType(StatusCodes.Status200OK)]
@@ -85,7 +85,7 @@ public async Task<ActionResult> Put(Guid id, [FromBody] RoleModel model)
8585
return Ok(model);
8686
}
8787

88-
[Authorize(AuthorizationPolicyNames.DeleteRolePolicy)]
88+
[Authorize(Permissions.DeleteRole)]
8989
[HttpDelete("{id}")]
9090
[ProducesResponseType(StatusCodes.Status200OK)]
9191
[ProducesResponseType(StatusCodes.Status404NotFound)]

src/Microservices/Services.Identity/ClassifiedAds.Services.Identity.Api/Controllers/UsersController.cs

+8-8
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public UsersController(Dispatcher dispatcher,
3939
_configuration = configuration;
4040
}
4141

42-
[Authorize(AuthorizationPolicyNames.GetUsersPolicy)]
42+
[Authorize(Permissions.GetUsers)]
4343
[HttpGet]
4444
public async Task<ActionResult<IEnumerable<User>>> Get()
4545
{
@@ -48,7 +48,7 @@ public async Task<ActionResult<IEnumerable<User>>> Get()
4848
return Ok(model);
4949
}
5050

51-
[Authorize(AuthorizationPolicyNames.GetUserPolicy)]
51+
[Authorize(Permissions.GetUser)]
5252
[HttpGet("{id}")]
5353
[ProducesResponseType(StatusCodes.Status200OK)]
5454
[ProducesResponseType(StatusCodes.Status404NotFound)]
@@ -59,7 +59,7 @@ public async Task<ActionResult<User>> Get(Guid id)
5959
return Ok(model);
6060
}
6161

62-
[Authorize(AuthorizationPolicyNames.AddUserPolicy)]
62+
[Authorize(Permissions.AddUser)]
6363
[HttpPost]
6464
[Consumes("application/json")]
6565
[ProducesResponseType(StatusCodes.Status201Created)]
@@ -86,7 +86,7 @@ public async Task<ActionResult<User>> Post([FromBody] UserModel model)
8686
return Created($"/api/users/{model.Id}", model);
8787
}
8888

89-
[Authorize(AuthorizationPolicyNames.UpdateUserPolicy)]
89+
[Authorize(Permissions.UpdateUser)]
9090
[HttpPut("{id}")]
9191
[Consumes("application/json")]
9292
[ProducesResponseType(StatusCodes.Status200OK)]
@@ -113,7 +113,7 @@ public async Task<ActionResult> Put(Guid id, [FromBody] UserModel model)
113113
return Ok(model);
114114
}
115115

116-
[Authorize(AuthorizationPolicyNames.SetPasswordPolicy)]
116+
[Authorize(Permissions.SetPassword)]
117117
[HttpPut("{id}/password")]
118118
[Consumes("application/json")]
119119
[ProducesResponseType(StatusCodes.Status200OK)]
@@ -133,7 +133,7 @@ public async Task<ActionResult> SetPassword(Guid id, [FromBody] SetPasswordModel
133133
return BadRequest(rs.Errors);
134134
}
135135

136-
[Authorize(AuthorizationPolicyNames.DeleteUserPolicy)]
136+
[Authorize(Permissions.DeleteUser)]
137137
[HttpDelete("{id}")]
138138
[ProducesResponseType(StatusCodes.Status200OK)]
139139
[ProducesResponseType(StatusCodes.Status404NotFound)]
@@ -145,7 +145,7 @@ public async Task<ActionResult> Delete(Guid id)
145145
return Ok();
146146
}
147147

148-
[Authorize(AuthorizationPolicyNames.SendResetPasswordEmailPolicy)]
148+
[Authorize(Permissions.SendResetPasswordEmail)]
149149
[HttpPost("{id}/passwordresetemail")]
150150
public async Task<ActionResult> SendResetPasswordEmail(Guid id)
151151
{
@@ -175,7 +175,7 @@ await _dispatcher.DispatchAsync(new AddEmailMessageCommand
175175
return Ok();
176176
}
177177

178-
[Authorize(AuthorizationPolicyNames.SendConfirmationEmailAddressEmailPolicy)]
178+
[Authorize(Permissions.SendConfirmationEmailAddressEmail)]
179179
[HttpPost("{id}/emailaddressconfirmation")]
180180
public async Task<ActionResult> SendConfirmationEmailAddressEmail(Guid id)
181181
{

src/Microservices/Services.Identity/ClassifiedAds.Services.Identity/Authorization/AuthorizationPolicyNames.cs

-37
This file was deleted.

0 commit comments

Comments
 (0)