c# - 如何在 RESTful WCF API 中实现 HMAC 身份验证

标签 c# rest wcf authentication hmac

我们正在使用 WCF(目前是 .Net 3.5,但很快就会迁移到 .Net 4)构建一个 RESTful API。我们有一个功能框架,但它目前是不安全的。它需要能够从 .Net 应用程序以及 iOS、Android 和 Web 应用程序访问。

我们想使用描述的 HMAC 身份验证方案 herehere ,但是在描述如何验证散列时,这两个示例似乎都分崩离析。第一个示例未能描述 UserKeys 对象(哈希表?),第二个示例缺少客户端和服务器端的 GetUserKey 方法。

任何人都可以解释如何在这些示例中生成/存储/检索/使用“用户 key ”/ token ,或者提供一个更好的示例(如果可能,提供源代码)如何在 RESTful 中使用 HMAC 授权WCF 服务?

编辑: 经过更多研究,我们确定我们需要更多的“Authorization”技术而不是“Authentication”技术(语义?)。我们实现了基本授权并保护了 SSL 背后的 API。 Basic Authorization 使用与 HMAC Authentication 方案相同的来自 Web 请求的“Authorization” header ,但传递以 Base64 编码的用户名:密码字符串而不是 token 。这使我们能够根据我们的数据库对用户进行自定义验证,以确定该用户是否获得许可并具有适当的安全权限来访问所需的 API 方法。

我们当然乐于听取有关如何完成自定义用户名/密码验证的其他选项以及其他用于保护 API 的方法。

最佳答案

检索用户 key 只是一个实现细节,您可以按照自己喜欢的方式进行,但在服务器上,它通常与用户名一起存储在数据库中。

基本方法非常简单。

  1. 服务器和客户端以某种方式交换共享 key 供用户使用。这可以用任何你喜欢的方式完成,包括发送一封老式的枯树式信件。通常这只是用户输入的密码。
  2. 当客户端想要发送请求时,他会构建完整的请求,然后使用 key 计算完整消息正文的哈希值(如果需要,还可以选择一些消息头)
  3. 接下来,客户端将计算出的哈希值和他的用户名添加到其中一个 header 中的消息中,并将其发送到服务。
  4. 该服务从邮件 header 中检索用户名,并在其自己的数据库中搜索该用户的私有(private) key 。
  5. 接下来,他使用 key 计算消息正文(和选定的 header )的哈希值以生成其哈希值。
  6. 如果客户端发送的散列值与服务器计算的散列值相匹配,则服务器知道该消息是由真实客户端发送的并且没有以任何方式更改。

真正棘手的部分是与用户共享 key 并确保其安全。这就是为什么有些服务允许生成具有有限生命周期的共享 key ,这样您就可以将 key 交给第三方临时代表您工作。

关于c# - 如何在 RESTful WCF API 中实现 HMAC 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8363315/

相关文章:

asp.net-mvc - 在 mvc 4 中使用 wcf 服务的问题

c# - WCF 无法通过 HTTPS 工作

c# - WCF NetTcpBinding 是否提供持久连接?

c# - 是什么让 Winform 职位最初变得陈旧?

json - 使用 PUT 在一个请求中更新多个 JSON 数据

java - Spring mvc 与 hibernate,如何添加 Restful 服务端点?

wcf - 如何在 ViewModel 中注入(inject) wcf 客户端依赖项并使其可测试?

c# - SSIS:无法将类型为 'System.Decimal' 的对象转换为类型 'System.Char[]'

c# - Asp.net 自动阻止任何类似于 html 代码的输入

java - Android 和 JAX-RS