WCF、RESTful Web 服务和自定义身份验证
Posted
技术标签:
【中文标题】WCF、RESTful Web 服务和自定义身份验证【英文标题】:WCF, RESTful Web Services and custom authentication 【发布时间】:2011-08-26 16:03:49 【问题描述】:我开始相信我是一个非常不称职的程序员。经过大量阅读,我仍然无法弄清楚如何干净地为 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 本身在 REST 思维方式中表现不佳。你可以做到,但感觉很hacky。我认为 WCF 团队已经意识到了这一点,他们正在努力解决它 (wcf.codeplex.com/wikipage?title=WCF%20HTTP)。无论如何,期待有人在这里回答,我可以使用它。我们为它编写了自己的 HTTP 模块,但不是理智的 IMO,所以不是答案。 【参考方案1】:当我研究如何为我自己的 WCF RESTful 服务实现安全性时,我花了一些时间研究其他流行的服务(如 flickr 和 amazon)如何实现自己的安全性 - 假设他们可能花更多的时间来考虑它而不是我有。 Flickr 的documentation 尤其有助于塑造我的签名和请求格式。
最后,我为我的服务选择了 HMAC(基于哈希的消息验证码)身份验证方案。
我创建了一个自定义 HMAC ServiceAuthorizationManager,用于验证每个请求的签名。每个请求包含以下内容:
用户令牌 时间戳 随机数 签名使用此信息,管理员可以从他们的令牌中查找用户的秘密,并可以使用提供的信息在服务器上重新创建签名。
我的签名由以下 MD5 哈希组成(值以特定顺序连接在一起并经过哈希处理,因此该值可以在服务器上重复):
apikey 用户令牌 秘密 时间戳 随机数我将 nonce 存储在 memcache 实例中一小段时间,以便快速检查是否有任何重放攻击。在该时间偏差(大约 10 分钟)之后,时间戳用于拒绝任何其他旧请求。
如果有帮助,我可以发布一些我的代码的 sn-ps。总的来说,我发现 HMAC 身份验证通常是最安全的方法,并且很容易在任何将使用您的服务的客户端(不仅仅是 .NET)上得到支持。
【讨论】:
你能把你的代码的一些sn-ps贴在某个地方吗?这将非常有帮助。或者通过电子邮件将我发送到 kral.konf (at) volny.cz。谢谢! 不幸的是,我目前无法访问该来源,但如果我有时间,我会看看是否可以制作另一个副本(我知道我应该在我写的时候就包含它原始回复)。 这个例子我们还要等多久 :)以上是关于WCF、RESTful Web 服务和自定义身份验证的主要内容,如果未能解决你的问题,请参考以下文章
使用 WCF 创建需要身份验证并使用 JSON 作为输入/输出格式的 RESTful Web 服务
表单身份验证、ASP.NET MVC 和 WCF RESTful 服务