fix(admin): resolve Medium code-review finding (Admin-008)
Add @ReleasedBy parameter to sp_ReleaseExternalIdReservation via a new EF migration so the operator principal (not the shared SQL account) is recorded in ExternalIdReservation.ReleasedBy and ConfigAuditLog.Principal. ReservationService.ReleaseAsync gains a releasedBy parameter; Reservations.razor resolves the signed-in user from AuthenticationState and passes it through. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
@page "/reservations"
|
||||
@using System.Security.Claims
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
@using Microsoft.AspNetCore.Components.Authorization
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@using ZB.MOM.WW.OtOpcUa.Admin.Services
|
||||
@using ZB.MOM.WW.OtOpcUa.Configuration.Entities
|
||||
@@ -86,6 +88,10 @@
|
||||
}
|
||||
|
||||
@code {
|
||||
// Admin-008: capture the signed-in operator so the release is attributed correctly in the
|
||||
// ExternalIdReservation.ReleasedBy column and the ConfigAuditLog.Principal column.
|
||||
[CascadingParameter] private Task<AuthenticationState>? AuthState { get; set; }
|
||||
|
||||
private List<ExternalIdReservation>? _active;
|
||||
private List<ExternalIdReservation>? _released;
|
||||
private ExternalIdReservation? _releasing;
|
||||
@@ -111,10 +117,20 @@
|
||||
private async Task ReleaseAsync()
|
||||
{
|
||||
if (_releasing is null || string.IsNullOrWhiteSpace(_reason)) { _error = "Reason is required"; return; }
|
||||
|
||||
// Resolve the operator principal. The page is [Authorize(Policy="CanPublish")] so
|
||||
// AuthState will be available with an authenticated user; fall back to "unknown" only
|
||||
// as a defensive last resort (should never happen in practice).
|
||||
var user = AuthState is not null ? (await AuthState).User : null;
|
||||
var operatorName = user?.FindFirstValue(ClaimTypes.Name)
|
||||
?? user?.FindFirstValue(ClaimTypes.NameIdentifier)
|
||||
?? "unknown";
|
||||
|
||||
_busy = true;
|
||||
try
|
||||
{
|
||||
await ReservationSvc.ReleaseAsync(_releasing.Kind.ToString(), _releasing.Value, _reason, CancellationToken.None);
|
||||
await ReservationSvc.ReleaseAsync(
|
||||
_releasing.Kind.ToString(), _releasing.Value, _reason, operatorName, CancellationToken.None);
|
||||
_releasing = null;
|
||||
await ReloadAsync();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user