54 lines
1.2 KiB
C#
54 lines
1.2 KiB
C#
using Microsoft.IdentityModel.Tokens;
|
|
using System.Text.Json;
|
|
|
|
namespace StellaOps.Auth.Security.Dpop;
|
|
|
|
public sealed partial class DpopProofValidator
|
|
{
|
|
private static string NormalizeHtu(Uri uri)
|
|
{
|
|
var builder = new UriBuilder(uri)
|
|
{
|
|
Fragment = null,
|
|
Query = null
|
|
};
|
|
return builder.Uri.ToString();
|
|
}
|
|
|
|
private static bool TryDecodeSegment(
|
|
string token,
|
|
int segmentIndex,
|
|
out JsonElement element,
|
|
out string? error)
|
|
{
|
|
element = default;
|
|
error = null;
|
|
|
|
var segments = token.Split('.');
|
|
if (segments.Length != 3)
|
|
{
|
|
error = "Token must contain three segments.";
|
|
return false;
|
|
}
|
|
|
|
if (segmentIndex < 0 || segmentIndex > 2)
|
|
{
|
|
error = "Segment index out of range.";
|
|
return false;
|
|
}
|
|
|
|
try
|
|
{
|
|
var json = Base64UrlEncoder.Decode(segments[segmentIndex]);
|
|
using var document = JsonDocument.Parse(json);
|
|
element = document.RootElement.Clone();
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
error = ex.Message;
|
|
return false;
|
|
}
|
|
}
|
|
}
|