🐛 Fix verify signing string failed due to gateway changed the host

This commit is contained in:
2025-12-30 12:48:53 +08:00
parent 10067f6141
commit d02edbd38d

View File

@@ -60,7 +60,7 @@ public class ActivityPubSignatureService(
return false; return false;
} }
var signingString = BuildSigningString(context, signatureParts); var signingString = BuildIncomingSigningString(context, signatureParts);
var signature = signatureParts.GetValueOrDefault("signature"); var signature = signatureParts.GetValueOrDefault("signature");
logger.LogInformation("Built signing string for verification. SigningString: {SigningString}, Signature: {Signature}", logger.LogInformation("Built signing string for verification. SigningString: {SigningString}, Signature: {Signature}",
@@ -103,7 +103,7 @@ public class ActivityPubSignatureService(
actorUri, publisher.Id); actorUri, publisher.Id);
var headersToSign = new[] { RequestTarget, "host", "date", "digest" }; var headersToSign = new[] { RequestTarget, "host", "date", "digest" };
var signingString = BuildSigningStringForRequest(request, headersToSign); var signingString = BuildOutgoingSigningString(request, headersToSign);
logger.LogInformation("Signing string for outgoing request: {SigningString}", signingString); logger.LogInformation("Signing string for outgoing request: {SigningString}", signingString);
@@ -182,7 +182,7 @@ public class ActivityPubSignatureService(
} }
} }
private Dictionary<string, string>? ParseSignatureHeader(string signatureHeader) private static Dictionary<string, string>? ParseSignatureHeader(string signatureHeader)
{ {
var parts = new Dictionary<string, string>(); var parts = new Dictionary<string, string>();
@@ -200,7 +200,7 @@ public class ActivityPubSignatureService(
return parts; return parts;
} }
private string BuildSigningString(HttpContext context, Dictionary<string, string> signatureParts) private string BuildIncomingSigningString(HttpContext context, Dictionary<string, string> signatureParts)
{ {
var headers = signatureParts.GetValueOrDefault("headers")?.Split(' '); var headers = signatureParts.GetValueOrDefault("headers")?.Split(' ');
if (headers == null || headers.Length == 0) if (headers == null || headers.Length == 0)
@@ -211,7 +211,7 @@ public class ActivityPubSignatureService(
foreach (var header in headers) foreach (var header in headers)
{ {
if (sb.Length > 0) if (sb.Length > 0)
sb.Append("\n"); sb.Append('\n');
sb.Append(header.ToLower()); sb.Append(header.ToLower());
sb.Append(": "); sb.Append(": ");
@@ -222,6 +222,10 @@ public class ActivityPubSignatureService(
var path = context.Request.Path.Value ?? ""; var path = context.Request.Path.Value ?? "";
sb.Append($"{method} {path}"); sb.Append($"{method} {path}");
} }
else if (header == "host")
{
sb.Append(Domain);
}
else else
{ {
if (context.Request.Headers.TryGetValue(header, out var values)) if (context.Request.Headers.TryGetValue(header, out var values))
@@ -234,7 +238,7 @@ public class ActivityPubSignatureService(
return sb.ToString(); return sb.ToString();
} }
private string BuildSigningStringForRequest(HttpRequestMessage request, string[] headers) private string BuildOutgoingSigningString(HttpRequestMessage request, string[] headers)
{ {
var sb = new StringBuilder(); var sb = new StringBuilder();
logger.LogInformation("Building signing string for request. Headers to sign: {Headers}", logger.LogInformation("Building signing string for request. Headers to sign: {Headers}",