From 47bff00268839daaad8236e892c6120f352abf0a Mon Sep 17 00:00:00 2001 From: XShine555 Date: Sat, 30 May 2026 02:24:55 +0200 Subject: [PATCH] Changes --- .../Authentication/TicketValidator.cs | 49 +++++++++++-------- .../Middleware/TicketValidationMiddleware.cs | 6 ++- StreamingGateway/StreamingGateway.csproj | 1 + 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/StreamingGateway/Authentication/TicketValidator.cs b/StreamingGateway/Authentication/TicketValidator.cs index 5556e42..b3fb469 100644 --- a/StreamingGateway/Authentication/TicketValidator.cs +++ b/StreamingGateway/Authentication/TicketValidator.cs @@ -1,4 +1,6 @@ +using System.Security.Claims; using System.Security.Cryptography; +using Ardalis.Result; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.JsonWebTokens; using Microsoft.IdentityModel.Tokens; @@ -8,45 +10,52 @@ namespace Musify.StreamingGateway.Authentication; public sealed class TicketValidator : IDisposable { - private readonly StreamTicketValidationOptions options; - private readonly RSA rsa; - private readonly TokenValidationParameters validationParameters; - private readonly JsonWebTokenHandler handler = new(); + private readonly StreamTicketValidationOptions _options; + private readonly RSA _rsa; + private readonly TokenValidationParameters _validationParameters; + private readonly JsonWebTokenHandler _handler = new(); public TicketValidator(IOptions options) { - this.options = options.Value; + _options = options.Value; - rsa = RSA.Create(); - rsa.ImportFromPem(File.ReadAllText(this.options.PublicKeyPath)); + _rsa = RSA.Create(); + _rsa.ImportFromPem(File.ReadAllText(_options.PublicKeyPath)); - validationParameters = new TokenValidationParameters + _validationParameters = new TokenValidationParameters { ValidateIssuer = true, - ValidIssuer = this.options.Issuer, + ValidIssuer = _options.Issuer, ValidateAudience = true, - ValidAudience = this.options.Audience, + ValidAudience = _options.Audience, ValidateLifetime = true, ValidateIssuerSigningKey = true, - IssuerSigningKey = new RsaSecurityKey(rsa), + IssuerSigningKey = new RsaSecurityKey(_rsa), ValidAlgorithms = [SecurityAlgorithms.RsaSha256], ClockSkew = TimeSpan.FromSeconds(30), }; } - public async Task TryGetPrefixAsync(string? token) + public async Task> ValidateTicketAsync(string? token) { if (string.IsNullOrWhiteSpace(token)) - return null; + return Result.Unauthorized(); - var result = await handler.ValidateTokenAsync(token, validationParameters); - if (!result.IsValid) - return null; + var result = await _handler.ValidateTokenAsync(token, _validationParameters); + if (result.IsValid) + return Result.Unauthorized(); - return result.Claims.TryGetValue("prefix", out var prefix) - ? prefix as string - : null; + if (!result.Claims.TryGetValue("prefix", out var claim)) + return Result.Unauthorized(); + + if (claim is not string prefix) + return Result.Unauthorized(); + + if (string.IsNullOrEmpty(prefix)) + return Result.Unauthorized(); + + return Result.Success(prefix); } - public void Dispose() => rsa.Dispose(); + public void Dispose() => _rsa.Dispose(); } diff --git a/StreamingGateway/Middleware/TicketValidationMiddleware.cs b/StreamingGateway/Middleware/TicketValidationMiddleware.cs index cba1fc3..e4ebbcf 100644 --- a/StreamingGateway/Middleware/TicketValidationMiddleware.cs +++ b/StreamingGateway/Middleware/TicketValidationMiddleware.cs @@ -23,15 +23,17 @@ public sealed class TicketValidationMiddleware( } var token = context.Request.Query[options.QueryParameterName].ToString(); - var prefix = await ticketValidator.TryGetPrefixAsync(token); + var validation = await ticketValidator.ValidateTicketAsync(token); - if (prefix is null) + if (!validation.IsSuccess) { logger.LogWarning("Rejected media request {Path}: missing or invalid ticket", path); context.Response.StatusCode = StatusCodes.Status401Unauthorized; return; } + var prefix = validation.Value; + var objectKey = remaining.Value?.TrimStart('/') ?? string.Empty; if (!objectKey.StartsWith(prefix, StringComparison.Ordinal)) { diff --git a/StreamingGateway/StreamingGateway.csproj b/StreamingGateway/StreamingGateway.csproj index bc16ead..7b7346b 100644 --- a/StreamingGateway/StreamingGateway.csproj +++ b/StreamingGateway/StreamingGateway.csproj @@ -9,6 +9,7 @@ +