C#ASP.Net 4 - 如何使用密钥/秘密来消费第三方api帖子?

时间:2016-07-26 06:57:14

标签: c# asp.net asp.net-web-api

作为Web API的新手,我已经能够创建一个简单的WEB API来接收POST数据并将其保存到数据库中。

但现在根据将发布数据的第三方API,他们提供了一些KEY / SECRET。我如何使用这些消费他们的POST?

非常感谢任何理解这一点的帮助。

另外,如何仅限制对特定Thrid方API的WEB API访问。

1 个答案:

答案 0 :(得分:1)

HMAC认证 - 为每个客户使用一个密钥,客户和服务器都知道HMAC对消息进行哈希处理。

消息是根据HTTP请求构建的,包括

  • URL
  • GET / POST / PUT / DELETE(CRUD)
  • 发布数据和查询字符串
  • 请求的DatTime

对于EG: 请求将使用签名HMAC哈希发送到Web服务器

Host: {host} Timestamp: {timestamp} Authentication: {username}:{signature}

GET请求:

[HTTPGet] /api/values User-Agent: Chrome Host: example.com Timestamp: Tuesday, July 26, 2016 12:39:46 PM Authentication: demouser:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw=

获取哈希签名

GET\n Tuesday, July 26, 2016 12:39:46 PM\n /api/values\n

QUERYString示例:

`[HTTPPost] / api / values?user = demo  用户代理:Chrome  主持人:localhost  内容类型:application / x-www-form-urlencoded  时间戳:2016年7月26日,星期二,12:42:6 PM  身份验证:演示:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw =

获取哈希签名

GET\n Tuesday, July 26, 2016 12:42:6 PM \n /api/values\n user=demo

表单数据和查询字符串必须是相同的顺序才能构建正确的输出。

当请求到达服务器时,实现了一个身份验证过滤器来解析请求以获取信息:HTTP动词,时间戳,uri,表单数据和查询字符串,然后基于这些,我们使用带有秘密的hmac哈希构建签名密钥(哈希密码)在服务器上。密钥是从数据库获取的,带有请求的用户名。

然后服务器将请求的签名与生成的签名进行比较,如果相等,则通过认证,否则失败。

建立签名:

private static string HashSignature(string password, string message)
{
var key = Encoding.UTF8.GetBytes(password.ToUpper());
string hashData;

using (var hmac = new HMACSHA256(key))
{
    var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
    hashData= Convert.ToBase64String(hash);
}

return hashData;
}

要防止重复调用服务器,请使用时间戳约束。

这里是演示https://github.com/thenna/Hmac.WebApi