2012-12-02 62 views
0

我正在开发一个API作为Windows应用程序和数据库之间的中间人。网络服务器将只是一个ASP。 NET通用处理程序返回json。 用户将登录到应用程序,他们的凭据将通过电线传输。从那里我要做的是生成一个会话密钥,应用程序可以使用从那时起的每个请求。 在可预见的未来,这不会是一个开放的API。 现在我想知道的是,如果这足够安全?我怎样才能阻止人们使用提琴手来复制电话? 有没有更好的方法呢?如果我使用SSL,会有帮助吗?如何保护API

我不想通过使用oauth来使事情复杂化。

谢谢!

回答

1

使用SSL。为了获得会话令牌,客户端应该使用通过SSL传输的用户名和密码进行身份验证。一旦通过验证,令牌应通过SSL传输到服务器以防止中间人攻击。

因此,这里的流量:

  1. 客户端通过SSL送他的凭据(用户名和密码)发送到Web方法
  2. Web方法验证凭据,并生成会话令牌,并返回该会话令牌给客户。
  3. 客户端发送会话令牌在对受保护资源的后续请求中。
  4. 服务器验证令牌以及是否有效授予访问受保护资源的权限。

您使用简单的Forms Authentication来生成会话令牌。 FormsAuthentication.EncryptFormsAuthentication.Decrypt方法对你来说可能是一个好的开始。表单身份验证令牌包含当前已通过身份验证的用户的加密值。如果您正在Web场中运行,请确保您的Web场的所有节点上都有静态的machine keys,否则在一个节点上加密的会话令牌可能不会在另一个节点上解密。

作为会话令牌的替代方案,您可以通过SSL使用basic authentication。缺点是证书通过每个请求的线路发送。即使您使用SSL,密码仍然通过电话传输,因此此方法不如会话令牌安全,但更易于设置。

+0

感谢您的详细解答! 但是,一个问题是我无法控制数据库。我将连接到现有的MySQL数据库,并且不能更改模式。现在据我所知(我已经离开了ASP开发了很久),为了实现ASP.NET窗体auth,您需要使用他们的模式或编写自定义实现。后者会再次过度复杂化。 是否有任何问题只是让我自己创建会话密钥的方式?像散列用户名和其他变量? – Matt

+0

@Matt,Forms Authentication与任何数据库或模式都完全无关。您似乎将表单身份验证与成员资格提供程序混淆,这是两种完全不同的概念。你可以完全正确地使用FA与会员资格和会员资格没有FA。所以在你的情况下,你需要做的就是检查数据库的用户名和密码(不管这个数据库是什么),然后调用Encrypt方法来生成密钥并作为cookie或自定义头返回给用户。散列用户名将无济于事,因为... –

+0

...散列是一个不可逆过程。这意味着如果你给这个用户这个散列,然后他发送给你另一个请求,你就无法知道谁是用户,除非你在数据库中存储了这些散列。另一方面FA是无国籍的。它使用加密(而不是哈希)。 –