2016-03-29 15 views
0

私は、AzureにデプロイされているWeb APIアプリケーションで、hereのHMAC認証アプローチに従っていますが、同じHTTPで404エラーを実行していますGETコール。Web API HMAC認証 - 断続的な404が見つかりません応答

私のリクエストURIは、フォーマットの半分の頃

http://mywebapp.azurewebsites.net/api/foo/bar?val=123 

で、HttpResponseMessageでリクエストURIが

として戻ってくるにもかかわらず、私は、サーバーへの呼び出しを行うときようです
http://mywebapp.azurewebsites.net/Account/Login?ReturnUrl=%2Fapi%2Ffoo%2Fbar%3Fval%3D123 

これは、fooコントローラにHMACAuthentication属性を適用した場合にのみ発生します。

奇妙な部分は毎回起こらず、私がlocalhostを実行しても起こらないということです。私はgithubリポジトリから正確に例をコピーしました。私はサーバの時間がこれと何か関係があるかもしれないと思っていましたが、それはなぜリクエストが時々通過し、他のリクエストで失敗するのかを説明しません。コードのどの部分がここに置くのに適しているかわからないので、私は何が助けになるのか教えてください。

私はこのことについて洞察を深めることができます。前もって感謝します!

答えて

1

問題が発生していたのは、isReplayRequestレポにあります。

は、ここで元のメソッドの定義です:

private bool isReplayRequest(string nonce, string requestTimeStamp) 
    { 
     if (System.Runtime.Caching.MemoryCache.Default.Contains(nonce)) 
     { 
      return true; 
     } 

     DateTime epochStart = new DateTime(1970, 01, 01, 0, 0, 0, 0, DateTimeKind.Utc); 
     TimeSpan currentTs = DateTime.UtcNow - epochStart; 

     var serverTotalSeconds = Convert.ToUInt64(currentTs.TotalSeconds); 
     var requestTotalSeconds = Convert.ToUInt64(requestTimeStamp); 

     if ((serverTotalSeconds - requestTotalSeconds) > requestMaxAgeInSeconds) 
     { 
      return true; 
     } 

     System.Runtime.Caching.MemoryCache.Default.Add(nonce, requestTimeStamp, DateTimeOffset.UtcNow.AddSeconds(requestMaxAgeInSeconds)); 

     return false; 
    } 

問題がserverTotalSecondsとrequestTotalSecondsが符号なし整数であるかの第二の条件で発生しました。最大値UInt64型である18446744073709551615として、 - タイムスタンプは負に終わるであろう周期ケースがあった

(requestTotalSeconds serverTotalSeconds)の値を設定してしまうことになる(すなわちrequestTotalSeconds 1によってserverTotalSecondsよりも大きかったです)保持することができます。

私の場合、2つのTimeSpanオブジェクトを使用して時間を比較し、その差を秒単位で求めました。

これは他の人に役立つことを願っています。

関連する問題