0

ServiceStack の認証メカニズムとして HMAC を使用する認証プロバイダーがあります。

を使用IHttpRequest.AbsoluteUriして を取得してUriいますが、Uriは期待したものではありません。UriHMAC に使用している 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
4

1 に答える 1

0

あなたのクライアントエンドはC#でもありますか(コントローラーのように)。その場合は、他の URL (ポート番号なし) から新しい System.Uri を作成し、その上で ToString を実行できます。

そうすれば、同じ解析を使用して URL を直接比較できます。異なるポート番号を異なるものにすることができるため、ポートを削除するよりも優れています。

于 2015-10-15T13:42:47.463 に答える