微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我们正在使用WCF构建一个RESTful API(目前为.Net 3.5,但将会很快转到.Net 4).我们有一个功能框架,但目前是无担保的.需要从.Net应用程序以及iOS,Android和Web应用程序访问它.

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

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

编辑:
经过更多的研究,我们确定我们需要更多的“Authorization”技术,而不是“Authentication”技术(语义?).我们实施了基本授权,并在SSL后保证了SSL.基本授权使用Web请求中相同的“授权”标头作为HMAC认证方案,但传递一个用户名:密码字符串,编码在Base64而不是令牌.这允许我们根据我们的数据库定制验证用户,以确定用户是否获得许可,并具有访问所需API方法的适当安全权限.

我们肯定会听到有关如何完成自定义用户名/密码验证和其他保护API的方法的其他选项.

解决方法

检索用户密钥只是一个实现细节,您可以以任何您喜欢的方式执行,但在服务器上,它通常与用户名一起存储在数据库中.

基本的方法真的很简单.

>不知何故,服务器和客户端交换共享密钥供用户使用.这可以做任何你喜欢的方式,包括发送一个老式的死树风格的信.通常这只是用户输入的密码.
>当客户端要发送请求时,他构建完整的请求,然后使用秘密密钥计算整个消息正文中的散列(如果需要,还可以选择一些消息头)
>接下来,客户端将计算的散列和他的用户名添加到其中一个标题中的消息,并将其发送到服务.
>该服务从消息头中检索用户名,并在其自己的数据库搜索用户的私有密钥.
>接下来,他使用密钥计算消息体上的散列(和选定的标题)来生成其散列.
>如果客户端发送的哈希与服务器计算服务器的哈希匹配,则服务器知道该消息是由真实客户端发送的,并且没有以任何方式进行更改.

真正唯一棘手的部分是与用户共享一个密钥,并保持安全.这就是为什么一些服务允许在有限的使用寿命期间生成共享密钥,所以您可以给第三方提供密钥来临时工作.

原文地址:https://www.jb51.cc/csharp/96626.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐