feat: Implement API client and token models with hashing and JWT authentication

- Added ApiClientModel and ApiTokenModel for managing API clients and tokens.
- Introduced ConfigurationDefinitionModel and ConfigurationValueModel for configuration management.
- Created CredentialSecretModel for storing credential secrets.
- Developed DeploymentArtifactModel and DeploymentBatchModel for deployment management.
- Enhanced DeploymentTargetModel and DeploymentTemplateSelectionModel to support template revisions.
- Added TemplateRevisionModel and TemplateVersionModel for versioning templates.
- Implemented ApiClientSecretHasher for secure secret hashing.
- Created ApiTokenService for generating and validating JWT tokens.
- Updated QueueJobService to handle deployment requests with artifacts.
- Configured authentication settings in appsettings.json for JWT and Negotiate authentication.
This commit is contained in:
Torsten Brendgen
2026-07-09 14:44:38 +02:00
parent 1aa2adac08
commit dc93ea0813
72 changed files with 32906 additions and 516 deletions

View File

@@ -55,6 +55,7 @@ namespace Microsoft.SelfService.Portal.Core.API.Repository
var templateVersion = requestedTemplateVersionId.HasValue
? _context.TemplateVersions
.Include(version => version.TemplateRevisions)
.Include(version => version.Template)
.ThenInclude(template => template.TemplateCategory)
.ThenInclude(category => category.Service)
@@ -66,6 +67,7 @@ namespace Microsoft.SelfService.Portal.Core.API.Repository
.Include(existing => existing.TemplateCategory)
.ThenInclude(existing => existing.Service)
.Include(existing => existing.TemplateVersions)
.ThenInclude(version => version.TemplateRevisions)
.FirstOrDefault(existing => existing.Id == deploymentBatch.TemplateId);
if (template == null)
@@ -128,11 +130,32 @@ namespace Microsoft.SelfService.Portal.Core.API.Repository
Id = Guid.NewGuid(),
DeploymentGroupId = deploymentBatch.Id,
TemplateVersionId = templateVersion.Id,
TemplateRevisionId = templateVersion.TemplateRevisions?.FirstOrDefault(revision => revision.IsCurrent)?.Id,
TemplateRole = "Service",
SortOrder = 10,
Alias = template.Name
});
}
else
{
foreach (var selection in deploymentBatch.TemplateSelections)
{
if (selection.TemplateRevisionId.HasValue)
{
continue;
}
var selectedVersion = selection.TemplateVersionId == templateVersion?.Id
? templateVersion
: _context.TemplateVersions
.Include(version => version.TemplateRevisions)
.FirstOrDefault(version => version.Id == selection.TemplateVersionId);
selection.TemplateRevisionId = selectedVersion?.TemplateRevisions
?.FirstOrDefault(revision => revision.IsCurrent)
?.Id;
}
}
if (deploymentBatch.TargetAssignments.Count == 0)
{
@@ -170,6 +193,10 @@ namespace Microsoft.SelfService.Portal.Core.API.Repository
{
DeploymentGroupId = deploymentBatch.Id,
TargetId = targetId,
TemplateRevisionId = deploymentBatch.TemplateSelections
.OrderBy(selection => selection.SortOrder)
.Select(selection => selection.TemplateRevisionId)
.FirstOrDefault(),
Status = QueueJobStatus.Pending,
JSONData = "{}"
});