asp.net - HMAC 和 WCF 服务 .net

标签 asp.net wcf wcf-data-services wcf-security hmac

所以我对 HMAC 身份验证非常陌生,我真的不知道自己在做什么,也不知道读 atm。

我一直在尝试正确理解以下文章/链接/讨论:

How to implement HMAC Authentication in a RESTful WCF API

http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/22/how-to-implement-hmac-authentication-on-a-restful-wcf-service.aspx

http://buchananweb.co.uk/security01.aspx

话虽如此,我有几个问题:

  1. 了解第一个链接,例如,如果我在 .net 中创建了一个 loginAuthentication 服务,并且将从 iPhone 应用程序进行访问,我是否为此传递未加密的用户名(消息)并且应该仅返回 true/false或者它应该返回一个加密字符串,我稍后将在其中用于其他事务(删除、插入服务等)?

    [ServiceContract]
    
    public partial class LoginService
    {
    
     [OperationContract]
     bool Authenticate(string username) {
       // stuffs
     }
    

    }

  2. 话虽如此,在我验证了用户之后,这就是我迷失的地方。我在数据库中保存“带有时间戳”的内容是否更好(有人告诉我这件事,我也读了一些关于这方面的讨论)?或者我是否只用加密消息返回它(取决于第一个问题),以便每次发出请求时都已附加时间戳?

    a.我该如何处理该时间戳?

    b.一旦消息再次发送用于另一个事务,它会被使用吗?

  3. key 和 secret 消息。我的理解是 key 是用户的密码。那么,如果用户发送他的用户名,我可以使用该用户的密码打开该消息吗?如果用户已经有一个 session 并且只是请求获取数据或请求删除、插入等,那么这是有意义的。如果只是验证用户的用户名和密码,是否仍然应该采用相同的方式?

感谢您的宝贵时间!

最佳答案

我想提的第一件事是,WCF Web Api 是一个不再开发的测试项目。它被 ASP.NET Web API 取代,这是一个用于开发 RESTful 服务的出色框架。

如果您想了解 RESTful 服务和身份验证的工作原理,Netflix API 将是一个很好的起点。他们有很多关于安全部分的文档,这帮助我更多地了解 HMAC。

HMAC 使用 key 创建哈希。客户端和服务器都维护 key 的副本,以便它们可以生成匹配的哈希值。这允许您“签署”请求,该请求既可以作为身份验证(您知道发送请求的人就是他们所说的人),又可以作为消息完整性(知道他们发送的消息是原始消息并且未被篡改)。

签名是通过组合创建的

1. Timestamp (unix epoc is the easiest to send in urls)
2. Nonce (a random number that can never be used twice to protect against someone re-using it)
3. Message (for a GET request this would be the URL, a POST would be the whole body)
4. Signature (the three previous items combined and hashed using the secret key)

以上每一项都可以在请求的查询字符串中发送,然后服务器可以使用前 3 项及其 key 副本来重新创建签名。如果签名匹配,那么一切都很好。

在基于普通 HTTP 的 RESTful API(不通过 ssl 使用 HTTPS)中,我会对发送的每个请求进行签名,因为这再次进行身份验证并提供消息完整性。否则,如果您只是发送身份验证 token ,您就知道用户已通过身份验证,但如果您没有消息摘要(HMAC 哈希)进行比较,您如何知道消息没有被篡改?

实现服务器端签名检查的一个简单方法是重写 System.Web.Http.AuthorizeAttribute 的 OnAuthorization(确保不使用 Mvc autorize 属性)。让它重建签名,就像您在客户端使用其 key 一样,如果不匹配,您可以返回 401。然后您可以使用新的授权属性来装饰所有需要身份验证的 Controller 。

希望这有助于消除您的一些困惑,并且不会让事情变得更加困惑。如果您需要,我稍后可以提供一些更具体的示例。

引用文献:

Netflix Api 文档: http://developer.netflix.com/docs/Security#0_18325 (转到有关创建签名的部分,他们还有一个链接,其中显示了用于创建 HMAC 签名的完整 .NET 示例)

用于创建 HMAC 签名的 .NET 类 http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs

我编写的 Netflix API 包装器:https://bitbucket.org/despertar1318/netflix-api/overview

ASP.NET Web API:http://www.asp.net/web-api

关于asp.net - HMAC 和 WCF 服务 .net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13589491/

相关文章:

c# - asp.net TreeView 中的 OnSelectedNodeChanged 事件不起作用

asp.net - AS3 向 ASP 传递和获取数据

javascript - JQuery http GET 用于通过外部 ID 获取记录

asp.net-mvc - 如何创建基于 Azure 的 WCF Restful API

wcf - 提前消费WCF服务进行开发?

c# - 无法从配置值打开数据库连接

c# - WCF 调用者未通过 WsDualHttpBinding 中的服务进行身份验证

wcf-data-services - WCF 数据服务安全选项

ios - 如何将 WCF 数据服务中的 JSON 图像数据转换为 iOS 中的 UIImage

.net - WCF 数据服务和 self 跟踪实体