我正在尝试为API实施HMAC安全性。一切正常,直到我尝试发布文件。
HMAC解决方案可以在这里找到 - https://github.com/gavinharriss/WebAPI.HMAC - 它是原始的一个分支,允许GET请求和POST请求。
附加文件的代码:
var requestContent = new MultipartFormDataContent();
var fileContent = new ByteArrayContent(file);
requestContent.Add(fileContent, "file", filename);
如果我立即调用HttpContent.ReadAsByteArrayAsync()
没有问题,则字节数组可用。
但是,HMAC HttpClient
(HMACHttpClient)实现了DelegatingHandler
(HMACDelegatingHandler),以便将HMAC标头附加到请求中。
在HMACDelegatingHandler中,请求作为HttpRequestMessage
传递,其中HttpRequestMessage.Content
属性在帮助程序中用于构建HMAC签名。
构建签名时,将从helper class:
调用以下代码private static async Task<byte[]> ComputeHash(HttpContent httpContent)
{
using (var md5 = MD5.Create())
{
byte[] hash = null;
if (httpContent != null)
{
var content = await httpContent.ReadAsByteArrayAsync(); // <-- Fails here
if (content.Length != 0)
{
hash = md5.ComputeHash(content);
}
}
return hash;
}
}
当单步执行代码时,var content = await httpContent.ReadAsByteArrayAsync()
行被击中,然后没有,没有错误。这些请求似乎变得很糟糕,但一切仍在运行,HttpClient
请求永远不会被发送。
任何想法会发生什么?