29 lines
1.2 KiB
C#
29 lines
1.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace BaronSoftware.SSO
|
|
{
|
|
internal static class PKCEUtil
|
|
{
|
|
public static string NewVerifier() => B64Url(RandomNumberGenerator.GetBytes(32));
|
|
public static string RandomToken() => B64Url(RandomNumberGenerator.GetBytes(16));
|
|
public static string Challenge(string verifier) => B64Url(SHA256.HashData(Encoding.ASCII.GetBytes(verifier)));
|
|
private static string B64Url(byte[] bytes) => Convert.ToBase64String(bytes).TrimEnd('=').Replace('+', '-').Replace('/', '_');
|
|
public static Dictionary<string, string> ParseQuery(string uri)
|
|
{
|
|
var result = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
|
var query = new Uri(uri).Query.TrimStart('?');
|
|
foreach (var pair in query.Split('&', StringSplitOptions.RemoveEmptyEntries))
|
|
{
|
|
var kv = pair.Split('=', 2);
|
|
result[Uri.UnescapeDataString(kv[0])] = kv.Length > 1 ? Uri.UnescapeDataString(kv[1]) : string.Empty;
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
}
|