2011-05-16 103 views
17

我开始相信我是一个非常无能的程序员。经过大量阅读,我仍然无法弄清楚如何干净地实现RESTful WCF服务的认证机制。WCF,REST风格的Web服务和自定义认证

我已经尝试了一切:

  1. this guide,才发现,所提出的认证机制是一个丑陋的黑客。

  2. 安装the WCF REST Starter Kit,只是发现它已经过时并已被替换为另一个项目模板。

  3. 安装said project template,只是发现它并没有提供任何自己的认证机制。

  4. 安装an IIS module that provides custom authentication functionality at transport level, 只有找出作者提供的零文档。只是为了找出我需要实现一个MembershipProvider。 (我想仅提供UserNamePasswordValidator

是否有实施一个RESTful WCF服务的身份验证机制,任何理智的方法是什么?

+3

我经历了完全相同的路径。在处理资源问题时也遇到了类似的问题,并且明显认识到WCF就是这样,在REST思维模式下表现不佳。你可以做到,但感觉很不好。我认为WCF团队知道这一点,他们正试图解决它(http://wcf.codeplex.com/wikipage?title=WCF%20HTTP)。无论如何,期待有人在这里回答,我可以使用它。我们为它编写了自己的HTTP模块,但不是理智的海事组织,所以没有答案。 – ale 2011-05-16 18:45:05

回答

10

当我调查如何为自己的WCF RESTful服务实现安全性时,我花了一些时间来研究像flickr和amazon等其他流行服务如何实现自己的安全性 - 假设他们可能花了更多时间考虑它比我有。 Flickr的documentation尤其有助于塑造我的签名和请求。

最后我为我的服务选择了一个HMAC(基于哈希的消息认证码)认证方案。

我创建了一个自定义的HMAC ServiceAuthorizationManager一个验证,因为它涉及的每个请求的签名中的每个请求包含以下内容:

  • 令牌的用户
  • 时间戳
  • 现时
  • 签名

使用此信息,管理员可以从他们的用户的秘密中查找用户的秘密令牌,并可以使用提供的信息在服务器上重新创建签名。

我的签名包括以下(以特定的顺序值进行了排列在一起,并且散列因此该值可以在服务器上重复)的MD5哈希:

  • apikey
  • userToken
  • 秘密
  • 时间戳
  • 现时

为了快速检查任何重放攻击,我将短时间存储在memcache实例中一段时间​​。在那段时间之后(大约10分钟),时间戳用于拒绝任何其他旧请求。

我可以张贴我的代码的一些片段,如果它会帮助。总的来说,我发现HMAC身份验证通常是最安全的方式,并且可以轻松支持任何将使用您的服务的客户端(而不仅仅是.NET)。

+1

你能否在你的代码片段中发布一些信息?这将是非常有益的。或通过电子邮件发送给kral.konf(at)volny.cz。谢谢! – 2011-12-30 16:09:51

+0

你有这种方法的示例代码吗? – Mike 2013-02-14 22:04:46

+0

不幸的是,我目前无法访问该源代码,但如果我得到一个片刻,我会看看是否可以复制另一个副本(我知道当我编写原始响应时应该将其包含在内)。 – efalconer 2013-02-28 15:39:34