我开始相信我是一个非常无能的程序员。经过大量阅读后,我仍然无法弄清楚如何干净地实现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服务的身份验证机制?
答案 0 :(得分:10)
当我研究如何为我自己的WCF RESTful服务实现安全性时,我花了一些时间来研究其他流行服务如flickr和amazon如何实现自己的安全性 - 假设他们可能花费的时间远远超过了我有。 Flickr的documentation特别有助于塑造我签名和请求的形式。
最后,我为我的服务选择了HMAC(基于哈希的消息认证码)认证方案。
我创建了一个自定义HMAC ServiceAuthorizationManager,用于验证每个请求的签名。每个请求包含以下内容:
使用此信息,经理可以从其令牌中查找用户的秘密,并可以使用提供的信息在服务器上重新创建签名。
我的签名包含以下MD5哈希值(值按特定顺序连接在一起并进行哈希处理,以便可以在服务器上重复该值):
我将nonce存储在memcache实例中一小段时间,以便快速检查任何重放攻击。在该时间偏差(大约10分钟)之后,时间戳用于拒绝任何其他旧请求。
如果有帮助,我可以发布我的代码的一些片段。总的来说,我发现HMAC身份验证通常是最安全的方式,并且很容易支持任何将使用您的服务的客户端(不仅仅是.NET)。