标签:httprequest c hmac
我正在尝试为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()行,然后执行任何操作,没有错误.这些请求似乎很po琐,但是一切仍在运行,并且HttpClient请求从未发送过.
有什么想法吗?
解决方法:
在对各种大小的文件进行测试之后,我发现当文件达到50,000字节标记时出现了问题.
这篇文章提供了一个解决方案:HttpContent.ReadAsStringAsync causes request to hang (or other strange behaviours).
如果替换HMACHelper中的错误行(第66行):
var content = await httpContent.ReadAsByteArrayAsync();
有了这个:
var ms = new MemoryStream();
await httpContent.CopyToAsync(ms);
ms.Seek(0, SeekOrigin.Begin);
var content = ms.ToArray();
它应该停止挂起.
标签:httprequest,c,hmac 来源: https://codeday.me/bug/20191118/2027113.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。