我开始相信我是一个严重无能的程序员。经过大量的阅读后,我仍然无法弄清楚如何清理RESTful WCF服务的身份验证机制。
我试过一切:
>在this guide之后,只有发现提出的认证机制是一个丑陋的黑客。
>安装the WCF REST Starter Kit,只发现它已经过时了,已经被另一个项目模板所取代了。
>安装said project template,只是发现它没有提供自己的任何认证机制。
>安装an IIS module that provides custom authentication functionality at transport level,只有找出作者提供的零文档。只有找出我需要实现一个MembershipProvider。 (我想提供一个UserNamePasswordValidator。)
有没有任何理智的方式来实现RESTful WCF服务的身份验证机制?
解决方法
当我正在调查如何为自己的WCF RESTful服务实现安全性时,我花了一些时间来研究其他流行的服务,如flickr和amazon如何实现自己的安全性 – 假设他们可能花费更多的时间来思考它。 Flickr的
documentation特别帮助我形成了我的签名和请求。
最后,我为我的服务选择了一个HMAC(基于哈希的消息认证代码)认证方案。
我创建了一个自定义的HMAC ServiceAuthorizationManager来验证每个请求的签名,每个请求包含以下内容:
使用该信息,管理员可以从其令牌中查找用户的秘密,并可以使用提供的信息在服务器上重新创建签名。
我的签名由以下MD5哈希值组成(值按特定顺序连接在一起,并进行散列,从而可以在服务器上重复该值):
apikey
> userToken
>秘密
>时间戳
>随机数
我在短时间内将该内存存储在一个memcache实例中,以便快速检查任何重播攻击。在这段时间偏差(约10分钟)之后,时间戳用于拒绝任何其他旧请求。
如果有帮助,我可以发布我的代码片段。一般来说,我发现HMAC身份验证通常是最安全的方式,并且在任何将使用您的服务的客户端(而不仅仅是.NET)上都可轻松支持。