【问题标题】:Web API HMAC Authentication- Intermittent 404 Not Found ResponseWeb API HMAC 身份验证 - 间歇性 404 Not Found 响应
【发布时间】:2016-03-29 15:23:14
【问题描述】:

我在 Azure 上部署的 Web Api 应用程序中遵循 here 概述的 HMAC 身份验证方法,但在相同的 HTTP GET 调用中,有一半以上的时间会遇到 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 repo 中复制了这个例子。我在想服务器时间可能与此有关,但这并不能解释为什么请求有时会通过而在其他时候失败......它应该是一致的。也不确定代码的哪一部分与此处相关,所以请告诉我有什么帮助。

我将不胜感激任何对此的见解。提前致谢!

【问题讨论】:

    标签: c# asp.net azure asp.net-web-api2 hmac


    【解决方案1】:

    想通了,问题出在 repo 中的 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 是 无符号整数,则在第二种情况下出现问题。

    有时会出现时间戳最终为负数的情况(即 requestTotalSeconds 比 serverTotalSeconds 大 1),这最终会将 (serverTotalSeconds - requestTotalSeconds) 的值设置为 18446744073709551615,这是 UInt64 可以容纳的最大值.

    在我的例子中,我使用了两个 TimeSpan 对象来比较时间并得出以秒为单位的差异。

    希望这对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2010-12-07
      • 2020-10-13
      相关资源
      最近更新 更多