ServiceStack の認証メカニズムとして HMAC を使用する認証プロバイダーがあります。
を使用IHttpRequest.AbsoluteUri
して を取得してUri
いますが、Uri
は期待したものではありません。Uri
HMAC に使用している HMAC ベース文字列のコア部分と同様に、運用前のサーバーで認証が失敗しています。
private string BuildBaseString(IHttpRequest req, string accountCode, string username, string timestamp)
{
var methodType = req.HttpMethod;
var absoluteUri = req.AbsoluteUri;
return string.Join("\n", methodType, timestamp, absoluteUri, accountCode, username).ToUpper();
}
ServiceStack の優れたログ機能を使用して、すべてをログに記録しています。私の仮定では、REST クライアントに入力された URL はIHttpRequest.AbsoluteUri
. ただし、小さいながらも大きな違いがあります。これは、ロード バランサーによるものと思われます。
https://service.com/auth/hmac
AbsoluteUri に変換されています:
https://service.com:80/auth/hmac
(これは ServiceStack ログで確認できます)
問題は、IHttpRequest
これを回避するために使用すべきより良いプロパティがあるか、またはポート番号を削除するために C# で Uri を自分で手動で分割する必要があるかということです。後者は少しハッキーなようです。
アップデート:
私はこれがうまくいくことを知っていますが、より良い方法はありますか?
var req = authService.RequestContext.Get<IHttpRequest>();
var u = new System.Uri(req.AbsoluteUrl); // https://service.com:80/auth/hmac
string clean = u.GetComponents( UriComponents.AbsoluteUri & ~UriComponents.Port, UriFormat.UriEscaped );
Console.WriteLine(clean); // https://service.com/auth/hmac