Skip to content

Commit 2b2d9f4

Browse files
feat: Update authorization policies for map rotations and enhance resource-based policy checks
1 parent 3718f72 commit 2b2d9f4

7 files changed

Lines changed: 37 additions & 27 deletions

File tree

src/XtremeIdiots.Portal.Web/ApiControllers/MapsController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace XtremeIdiots.Portal.Web.ApiControllers;
1313
/// <summary>
1414
/// API controller for maps data operations
1515
/// </summary>
16-
[Authorize(Policy = AuthPolicies.AccessMaps)]
16+
[Authorize(Policy = AuthPolicies.AccessMapRotations)]
1717
[Route("Maps")]
1818
public class MapsController(
1919
IRepositoryApiClient repositoryApiClient,

src/XtremeIdiots.Portal.Web/Controllers/MapsController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace XtremeIdiots.Portal.Web.Controllers;
1818
/// <param name="telemetryClient">Client for tracking telemetry data</param>
1919
/// <param name="logger">Logger instance for this controller</param>
2020
/// <param name="configuration">Application configuration</param>
21-
[Authorize(Policy = AuthPolicies.AccessMaps)]
21+
[Authorize(Policy = AuthPolicies.AccessMapRotations)]
2222
public class MapsController(
2323
IRepositoryApiClient repositoryApiClient,
2424
TelemetryClient telemetryClient,

src/XtremeIdiots.Portal.Web/Helpers/PolicyTagHelper.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,19 @@ public class PolicyTagHelper(IAuthorizationService authService, IHttpContextAcce
1212

1313
public required string Policy { get; set; }
1414

15+
/// <summary>
16+
/// Optional resource to pass to the authorization handler for resource-based policy checks.
17+
/// When provided, enables handlers that require a resource (e.g., GameType) to evaluate correctly.
18+
/// </summary>
19+
public object? PolicyResource { get; set; }
20+
1521
public async override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
1622
{
17-
if (!(await authService.AuthorizeAsync(principal, Policy).ConfigureAwait(false)).Succeeded)
23+
var result = PolicyResource != null
24+
? await authService.AuthorizeAsync(principal, PolicyResource, Policy).ConfigureAwait(false)
25+
: await authService.AuthorizeAsync(principal, Policy).ConfigureAwait(false);
26+
27+
if (!result.Succeeded)
1828
output.SuppressOutput();
1929
}
2030
}

src/XtremeIdiots.Portal.Web/Views/MapRotations/AssignmentStatus.cshtml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818
<a asp-action="Details" asp-route-id="@Model.Rotation.MapRotationId" class="btn btn-outline-secondary btn-sm">
1919
<i class="fa-solid fa-fw fa-arrow-left"></i> Back to @Model.Rotation.Title
2020
</a>
21-
<a policy="@AuthPolicies.ManageMapRotations" asp-action="EditAssignment" asp-route-id="@Model.Assignment.MapRotationServerAssignmentId" class="btn btn-outline-primary btn-sm">
21+
<a policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="EditAssignment" asp-route-id="@Model.Assignment.MapRotationServerAssignmentId" class="btn btn-outline-primary btn-sm">
2222
<i class="fa-solid fa-fw fa-edit"></i> Edit Assignment
2323
</a>
24-
<a policy="@AuthPolicies.ManageMaps" asp-controller="MapManager" asp-action="Manage" asp-route-id="@Model.Assignment.GameServerId" class="btn btn-outline-secondary btn-sm">
24+
<a policy="@AuthPolicies.ManageMaps" policy-resource="@Model.Rotation.GameType" asp-controller="MapManager" asp-action="Manage" asp-route-id="@Model.Assignment.GameServerId" class="btn btn-outline-secondary btn-sm">
2525
<i class="fa-solid fa-fw fa-hard-drive"></i> Manage Server Maps
2626
</a>
2727
</div>
@@ -101,7 +101,7 @@
101101
<div class="mt-3">
102102
@if (Model.Assignment.DeploymentState == DeploymentState.Pending || Model.Assignment.DeploymentState == DeploymentState.Failed)
103103
{
104-
<form policy="@AuthPolicies.ManageMapRotations" asp-action="SyncAssignment" method="post" class="d-inline">
104+
<form policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="SyncAssignment" method="post" class="d-inline">
105105
@Html.AntiForgeryToken()
106106
<input type="hidden" name="assignmentId" value="@Model.Assignment.MapRotationServerAssignmentId" />
107107
<input type="hidden" name="mapRotationId" value="@Model.Rotation.MapRotationId" />
@@ -112,7 +112,7 @@
112112
}
113113
@if (Model.IsStale && Model.Assignment.DeploymentState == DeploymentState.Synced)
114114
{
115-
<form policy="@AuthPolicies.ManageMapRotations" asp-action="SyncAssignment" method="post" class="d-inline">
115+
<form policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="SyncAssignment" method="post" class="d-inline">
116116
@Html.AntiForgeryToken()
117117
<input type="hidden" name="assignmentId" value="@Model.Assignment.MapRotationServerAssignmentId" />
118118
<input type="hidden" name="mapRotationId" value="@Model.Rotation.MapRotationId" />
@@ -123,7 +123,7 @@
123123
}
124124
@if (Model.Assignment.DeploymentState == DeploymentState.Synced && !Model.IsStale && !string.IsNullOrEmpty(Model.Assignment.ConfigFilePath) && Model.Assignment.ActivationState != ActivationState.Active)
125125
{
126-
<form policy="@AuthPolicies.ManageMapRotations" asp-action="ActivateAssignment" method="post" class="d-inline">
126+
<form policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="ActivateAssignment" method="post" class="d-inline">
127127
@Html.AntiForgeryToken()
128128
<input type="hidden" name="assignmentId" value="@Model.Assignment.MapRotationServerAssignmentId" />
129129
<input type="hidden" name="mapRotationId" value="@Model.Rotation.MapRotationId" />
@@ -134,7 +134,7 @@
134134
}
135135
@if (Model.Assignment.ActivationState == ActivationState.Active)
136136
{
137-
<form policy="@AuthPolicies.ManageMapRotations" asp-action="DeactivateAssignment" method="post" class="d-inline">
137+
<form policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="DeactivateAssignment" method="post" class="d-inline">
138138
@Html.AntiForgeryToken()
139139
<input type="hidden" name="assignmentId" value="@Model.Assignment.MapRotationServerAssignmentId" />
140140
<input type="hidden" name="mapRotationId" value="@Model.Rotation.MapRotationId" />
@@ -145,7 +145,7 @@
145145
}
146146
@if (Model.Assignment.DeploymentState == DeploymentState.Synced)
147147
{
148-
<form policy="@AuthPolicies.ManageMapRotations" asp-action="VerifyAssignment" method="post" class="d-inline">
148+
<form policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="VerifyAssignment" method="post" class="d-inline">
149149
@Html.AntiForgeryToken()
150150
<input type="hidden" name="assignmentId" value="@Model.Assignment.MapRotationServerAssignmentId" />
151151
<input type="hidden" name="mapRotationId" value="@Model.Rotation.MapRotationId" />
@@ -156,7 +156,7 @@
156156
}
157157
@if (Model.Assignment.DeploymentState is not DeploymentState.Removing)
158158
{
159-
<form policy="@AuthPolicies.ManageMapRotations" asp-action="DeleteAssignment" method="post" class="d-inline">
159+
<form policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="DeleteAssignment" method="post" class="d-inline">
160160
@Html.AntiForgeryToken()
161161
<input type="hidden" name="assignmentId" value="@Model.Assignment.MapRotationServerAssignmentId" />
162162
<input type="hidden" name="mapRotationId" value="@Model.Rotation.MapRotationId" />
@@ -290,7 +290,7 @@
290290
<td>
291291
@if (isInProgress)
292292
{
293-
<form policy="@AuthPolicies.ManageMapRotations" asp-action="CancelOperation" method="post" class="d-inline">
293+
<form policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="CancelOperation" method="post" class="d-inline">
294294
@Html.AntiForgeryToken()
295295
<input type="hidden" name="operationId" value="@op.MapRotationAssignmentOperationId" />
296296
<input type="hidden" name="assignmentId" value="@Model.Assignment.MapRotationServerAssignmentId" />
@@ -302,7 +302,7 @@
302302
}
303303
@if (op.Status is AssignmentOperationStatus.Cancelled or AssignmentOperationStatus.Failed && !string.IsNullOrEmpty(op.DurableFunctionInstanceId))
304304
{
305-
<form policy="@AuthPolicies.ManageMapRotations" asp-action="TerminateOrchestration" method="post" class="d-inline">
305+
<form policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="TerminateOrchestration" method="post" class="d-inline">
306306
@Html.AntiForgeryToken()
307307
<input type="hidden" name="instanceId" value="@op.DurableFunctionInstanceId" />
308308
<input type="hidden" name="assignmentId" value="@Model.Assignment.MapRotationServerAssignmentId" />

src/XtremeIdiots.Portal.Web/Views/MapRotations/Details.cshtml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@
3737
{
3838
<span class="badge bg-outline-secondary">@Model.Rotation.Category</span>
3939
}
40-
<a policy="@AuthPolicies.CreateMapRotation" asp-action="Clone" asp-route-id="@Model.Rotation.MapRotationId" class="btn btn-outline-secondary btn-sm">
40+
<a policy="@AuthPolicies.CreateMapRotation" policy-resource="@Model.Rotation.GameType" asp-action="Clone" asp-route-id="@Model.Rotation.MapRotationId" class="btn btn-outline-secondary btn-sm">
4141
<i class="fa-solid fa-fw fa-clone"></i> Clone
4242
</a>
43-
<a policy="@AuthPolicies.EditMapRotation" asp-action="Edit" asp-route-id="@Model.Rotation.MapRotationId" class="btn btn-outline-primary btn-sm">
43+
<a policy="@AuthPolicies.EditMapRotation" policy-resource="@Model.Rotation.GameType" asp-action="Edit" asp-route-id="@Model.Rotation.MapRotationId" class="btn btn-outline-primary btn-sm">
4444
<i class="fa-solid fa-fw fa-pen-to-square"></i> Edit
4545
</a>
46-
<form policy="@AuthPolicies.DeleteMapRotation" asp-action="Delete" asp-route-id="@Model.Rotation.MapRotationId" method="post" class="d-inline">
46+
<form policy="@AuthPolicies.DeleteMapRotation" policy-resource="@Model.Rotation.GameType" asp-action="Delete" asp-route-id="@Model.Rotation.MapRotationId" method="post" class="d-inline">
4747
@Html.AntiForgeryToken()
4848
<button type="submit" class="btn btn-outline-danger btn-sm" data-confirm="Are you sure you want to delete this map rotation? This cannot be undone.">
4949
<i class="fa-solid fa-fw fa-trash"></i> Delete
@@ -157,7 +157,7 @@
157157
<div class="ibox-title">
158158
<h5>Server Assignments (@(Model.Rotation.ServerAssignments?.Count ?? 0))</h5>
159159
<div class="ibox-tools">
160-
<a policy="@AuthPolicies.ManageMapRotations" asp-action="CreateAssignment" asp-route-mapRotationId="@Model.Rotation.MapRotationId" class="btn btn-outline-primary btn-sm">
160+
<a policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="CreateAssignment" asp-route-mapRotationId="@Model.Rotation.MapRotationId" class="btn btn-outline-primary btn-sm">
161161
<i class="fa-solid fa-fw fa-plus"></i> Assign to Server
162162
</a>
163163
</div>
@@ -243,15 +243,15 @@
243243
<a asp-action="AssignmentStatus" asp-route-id="@assignment.MapRotationServerAssignmentId" class="btn btn-outline-secondary btn-sm me-1">
244244
<i class="fa-solid fa-fw fa-eye"></i> Status
245245
</a>
246-
<a policy="@AuthPolicies.ManageMapRotations" asp-action="EditAssignment" asp-route-id="@assignment.MapRotationServerAssignmentId" class="btn btn-outline-secondary btn-sm me-1">
246+
<a policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="EditAssignment" asp-route-id="@assignment.MapRotationServerAssignmentId" class="btn btn-outline-secondary btn-sm me-1">
247247
<i class="fa-solid fa-fw fa-edit"></i> Edit
248248
</a>
249-
<a policy="@AuthPolicies.ManageMaps" asp-controller="MapManager" asp-action="Manage" asp-route-id="@assignment.GameServerId" class="btn btn-outline-secondary btn-sm me-1" title="Manage maps on this server">
249+
<a policy="@AuthPolicies.ManageMaps" policy-resource="@Model.Rotation.GameType" asp-controller="MapManager" asp-action="Manage" asp-route-id="@assignment.GameServerId" class="btn btn-outline-secondary btn-sm me-1" title="Manage maps on this server">
250250
<i class="fa-solid fa-fw fa-hard-drive"></i> Maps
251251
</a>
252252
@if (assignment.DeploymentState == DeploymentState.Pending || assignment.DeploymentState == DeploymentState.Failed)
253253
{
254-
<form policy="@AuthPolicies.ManageMapRotations" asp-action="SyncAssignment" method="post" class="d-inline">
254+
<form policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="SyncAssignment" method="post" class="d-inline">
255255
@Html.AntiForgeryToken()
256256
<input type="hidden" name="assignmentId" value="@assignment.MapRotationServerAssignmentId" />
257257
<input type="hidden" name="mapRotationId" value="@Model.Rotation.MapRotationId" />
@@ -262,7 +262,7 @@
262262
}
263263
@if (isStale && assignment.DeploymentState == DeploymentState.Synced)
264264
{
265-
<form policy="@AuthPolicies.ManageMapRotations" asp-action="SyncAssignment" method="post" class="d-inline">
265+
<form policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="SyncAssignment" method="post" class="d-inline">
266266
@Html.AntiForgeryToken()
267267
<input type="hidden" name="assignmentId" value="@assignment.MapRotationServerAssignmentId" />
268268
<input type="hidden" name="mapRotationId" value="@Model.Rotation.MapRotationId" />
@@ -273,7 +273,7 @@
273273
}
274274
@if (assignment.DeploymentState == DeploymentState.Synced && !isStale && !string.IsNullOrEmpty(assignment.ConfigFilePath) && assignment.ActivationState != ActivationState.Active)
275275
{
276-
<form policy="@AuthPolicies.ManageMapRotations" asp-action="ActivateAssignment" method="post" class="d-inline">
276+
<form policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="ActivateAssignment" method="post" class="d-inline">
277277
@Html.AntiForgeryToken()
278278
<input type="hidden" name="assignmentId" value="@assignment.MapRotationServerAssignmentId" />
279279
<input type="hidden" name="mapRotationId" value="@Model.Rotation.MapRotationId" />
@@ -284,7 +284,7 @@
284284
}
285285
@if (assignment.ActivationState == ActivationState.Active)
286286
{
287-
<form policy="@AuthPolicies.ManageMapRotations" asp-action="DeactivateAssignment" method="post" class="d-inline">
287+
<form policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="DeactivateAssignment" method="post" class="d-inline">
288288
@Html.AntiForgeryToken()
289289
<input type="hidden" name="assignmentId" value="@assignment.MapRotationServerAssignmentId" />
290290
<input type="hidden" name="mapRotationId" value="@Model.Rotation.MapRotationId" />
@@ -293,7 +293,7 @@
293293
</button>
294294
</form>
295295
}
296-
<form policy="@AuthPolicies.ManageMapRotations" asp-action="DeleteAssignment" method="post" class="d-inline">
296+
<form policy="@AuthPolicies.ManageMapRotations" policy-resource="@Model.Rotation.GameType" asp-action="DeleteAssignment" method="post" class="d-inline">
297297
@Html.AntiForgeryToken()
298298
<input type="hidden" name="assignmentId" value="@assignment.MapRotationServerAssignmentId" />
299299
<input type="hidden" name="mapRotationId" value="@Model.Rotation.MapRotationId" />

0 commit comments

Comments
 (0)